iled to attach interrupt\n");
goto fail_irq;
}
/*
初始化octeon I2C 控制器
*/
result = octeon_i2c_initlowlevel(i2c);
if (result) {
dev_err(i2c->dev, "init low level failed\n");
goto fail_add;
}
/*
设置octeon I2C 时钟
*/
result = octeon_i2c_setclock(i2c);
/*
添加octeon I2C 的寄存器read/write实现方法
*/
i2c->adap = octeon_i2c_ops;
i2c->adap.timeout = msecs_to_jiffies(50);
i2c->adap.dev.parent = &pdev->dev;
i2c->adap.dev.of_node = pdev->dev.of_node;
i2c_set_adapdata(&i2c->adap, i2c);
platform_set_drvdata(pdev, i2c);
/*
调用 i2c-core提供的注册adapter接口API.
*/
result = i2c_add_adapter(&i2c->adap);
if (result < 0) {
dev_err(i2c->dev, "failed to add adapter\n");
goto fail_add;
}
/*
注册adapter成功, 打印出当前版本号
*/
dev_info(i2c->dev, "version %s\n", DRV_VERSION);
/*
of_i2c_register_devices最终调用的是i2c-core提供的i2c_new_device()函数, 建立一个的i2c adapter.
*/
of_i2c_register_devices(&i2c->adap);
..
}
在此, octeon处理器先将定义好其特定的adapter数据结构, 将针对octeon处理器的 i2c 操作(i2c_algorithm)实现方法填充到此adapter结构体中, 最后, 使用 i2c-core提供的adapter注册函数 i2c_add_adapter().