图3.2 omap_i2c_probe的执行流程
函数omap_i2c_probe的简要代码如下:
static int __init
omap_i2c_probe(struct platform_device *pdev)
{
struct omap_i2c_dev *dev;
struct i2c_adapter *adap;
struct resource *mem, *irq, *ioarea;
irq_handler_t isr;
……
/* NOTE: driver uses the static register mapping */
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
……
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
……
dev = kzalloc(sizeof(struct omap_i2c_dev), GFP_KERNEL);
……
dev->dev = &pdev->dev;
dev->irq = irq->start;
dev->base = ioremap(mem->start, mem->end - mem->start + 1);
……
/* reset ASAP, clearing any IRQs */
omap_i2c_init(dev);
isr = (dev->rev < OMAP_I2C_REV_2) ? omap_i2c_rev1_isr : omap_i2c_isr;
r = request_irq(dev->irq, isr, 0, pdev->name, dev);
……
adap = &dev->adapter;
i2c_set_adapdata(adap, dev);
adap->owner = THIS_MODULE;
adap->class = I2C_CLASS_HWMON;
strncpy(adap->name, "OMAP I2C adapter", sizeof(adap->name));
adap->algo = &omap_i2c_algo;
adap->dev.parent = &pdev->dev;
/* i2c device drivers may be active on return from add_adapter() */
adap->nr = pdev->id;
r = i2c_add_numbered_adapter(adap);
……
return 0;
……
}
这里定义了I2C adapter的中断处理函数omap_i2c_isr(),该函数对I2C控制器的中断事件进行响应,主要实现了对I2C数据收发中断事件的处理。
这边还涉及到了一个i2c_algorithm结构的变量omap_i2c_algo,该变量的定义如下:
static const struct i2c_algorithm omap_i2c_algo = {
.master_xfer = omap_i2c_xfer,
.functionality = omap_i2c_func,
};
omap_i2c_xfer接口函数实现了底层I2C数据传输的方法。
omap_i2c_probe函数最后使用了 i2c_add_numbered_adapter()将adapter注册到i2c-core层,adapter的总线号保存在平台设备数组 omap_i2c_devices中,见3.1.1节,由于该数组中有三个成员,即三条I2C总线,所以这里会建立三个I2C adapter,总线号分别为1,2,3。