基于高通MSM 8x60的I2C驱动终极讲解(2)

上一篇文章已经把I2C控制器所用的platform devices准备好啦,现在开始注册,该文件在板级支持文件中,board-xxx.c文件中。
static struct platform_device *surf_devices[] __initdata = {
.........
#ifdef CONFIG_I2C_QUP
 &msm_gsbi3_qup_i2c_device,
 &msm_gsbi4_qup_i2c_device,
 &msm_gsbi7_qup_i2c_device,
 &msm_gsbi8_qup_i2c_device,
 &msm_gsbi9_qup_i2c_device,
 &msm_gsbi12_qup_i2c_device,
#endif
........
};
 
继续对该I2C平台设备结构体初始化
static void __init msm8x60_init_buses(void)
{
 ............
 #ifdef CONFIG_I2C_QUP
 msm_gsbi3_qup_i2c_device.dev.platform_data = &msm_gsbi3_qup_i2c_pdata;
 msm_gsbi4_qup_i2c_device.dev.platform_data = &msm_gsbi4_qup_i2c_pdata;
 msm_gsbi7_qup_i2c_device.dev.platform_data = &msm_gsbi7_qup_i2c_pdata;
 msm_gsbi8_qup_i2c_device.dev.platform_data = &msm_gsbi8_qup_i2c_pdata;
 msm_gsbi9_qup_i2c_device.dev.platform_data = &msm_gsbi9_qup_i2c_pdata;
 msm_gsbi12_qup_i2c_device.dev.platform_data = &msm_gsbi12_qup_i2c_pdata;
 #endif
............
}
其中初始化的platform_data如下
static struct msm_i2c_platform_data msm_gsbi3_qup_i2c_pdata = {
 .clk_freq = 100000,
 .src_clk_rate = 24000000,
 .clk = "gsbi_qup_clk",
 .pclk = "gsbi_pclk",
 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
};
static struct msm_i2c_platform_data msm_gsbi4_qup_i2c_pdata = {
 .clk_freq = 100000,
 .src_clk_rate = 24000000,
 .clk = "gsbi_qup_clk",
 .pclk = "gsbi_pclk",
 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
};
static struct msm_i2c_platform_data msm_gsbi7_qup_i2c_pdata = {
 .clk_freq = 100000,
 .src_clk_rate = 24000000,
 .clk = "gsbi_qup_clk",
 .pclk = "gsbi_pclk",
 .pri_clk = 60,
 .pri_dat = 59,
 .msm_i2c_config_gpio = gsbi7_qup_i2c_gpio_config,
};
static struct msm_i2c_platform_data msm_gsbi8_qup_i2c_pdata = {
 .clk_freq = 100000,
 .src_clk_rate = 24000000,
 .clk = "gsbi_qup_clk",
 .pclk = "gsbi_pclk",
 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
};
static struct msm_i2c_platform_data msm_gsbi9_qup_i2c_pdata = {
 .clk_freq = 100000,
 .src_clk_rate = 24000000,
 .clk = "gsbi_qup_clk",
 .pclk = "gsbi_pclk",
 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
};
static struct msm_i2c_platform_data msm_gsbi12_qup_i2c_pdata = {
 .clk_freq = 100000,
 .src_clk_rate = 24000000,
 .clk = "gsbi_qup_clk",
 .pclk = "gsbi_pclk",
 .use_gsbi_shared_mode = 1,
 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
};
其中的msm_i2c_config_gpio赋值的值的定义如下
static void gsbi7_qup_i2c_gpio_config(int adap_id, int config_type)
{
 if (config_type == 0) {
  gpio_tlmm_config(gsbi7_gpio_table[0], GPIO_CFG_ENABLE);
  gpio_tlmm_config(gsbi7_gpio_table[1], GPIO_CFG_ENABLE);
 } else {
  gpio_tlmm_config(gsbi7_i2c_table[0], GPIO_CFG_ENABLE);
  gpio_tlmm_config(gsbi7_i2c_table[1], GPIO_CFG_ENABLE);
 }
}
下面的函数会注册该平台设备
static void __init msm8x60_init(struct msm_board_data *board_data)
{
  ..........
  msm8x60_init_buses();
  ..........
  platform_add_devices(surf_devices,ARRAY_SIZE(surf_devices));
  ..........
}
 
下面的函数会调用上面的初始化
static void __init msm8x60_xxx_init(void)
{
  msm8x60_init(&msm8x60_xxx_board_data);
}
上面的函数会挂载到板级的结构中。
MACHINE_START(MSM8X60_xxx, "QCT MSM8X60 xxx")
 .map_io = msm8x60_map_io,
 .init_irq = msm8x60_init_irq,
 .init_machine = msm8x60_xxx_init, //挂载的板级初始化函数
 .timer = &msm_timer,
MACHINE_END
以上就是对I2C控制器的注册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值