//探测函数用于挂载驱动时获取I2C的设备ID
static int xrm117x_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct xrm117x_devtype *devtype;
unsigned long flags = 0;
int ret;
if (i2c->dev.of_node) { //从设备树传入I2C的ID值
const struct of_device_id *of_id =
of_match_device(xrm117x_dt_ids, &i2c->dev);
devtype = (struct xrm117x_devtype *)of_id->data;
} else { //从板载定义的信息中获取I2C的ID值
devtype = (struct xrm117x_devtype *)id->driver_data;
flags = IRQF_TRIGGER_FALLING;
}
xrm117x_i2c_client = i2c;
ret = xrm117x_probe(&i2c->dev, devtype,i2c->irq, flags);
return ret;
}
//定义设备树用于匹配的驱动节点
static const struct of_device_id __maybe_unused xrm117x_dt_ids[] = {
{ .compatible = "exar,xrm117x", .data = &xrm117x_devtype, },
{ }
};
MODULE_DEVICE_TABLE(of, xrm117x_dt_ids);
//定义设备驱动
static const struct i2c_device_id xrm117x_i2c_id_table[] = {
{ "xrm117x", (kernel_ulong_t)&xrm117x_devtype, },
{ }
};
MODULE_DEVICE_TABLE(i2c, xrm117x_i2c_id_table);
static struct i2c_driver xrm117x_i2c_uart_driver = {
.driver = {
.name = XRM117XX_NAME,
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(xrm117x_dt_ids),
},
.probe = xrm117x_i2c_probe,
.remove = xrm117x_i2c_remove,
.id_table = xrm117x_i2c_id_table,
};