上一篇大概讲了一下gsl680驱动的初始化部分,这部分是比较基础的,下面就开始第二部分:gsl680驱动的前期工作
首先会对一开始声明的input_dev结构体进行一个申请操作,但是这部分是与Input子系统相关的,目前先记住他,不分析他。知道是申请input子系统以及赋值即可。留到第三篇讲解
input_dev = input_allocate_device();
input_dev->name = client->name;
input_dev->phys = "I2C";
input_dev->dev.parent = &client->dev;
input_dev->id.bustype = BUS_I2C;
然后就是与供电相关的初始化操作,
regulator_get有2个参数,一个是device结构体,一个是id,到这里不难看出来他的目的就是获取对应设备树上的vdd属性(与本篇主体关联度不是特别大的一些api我不会写那么多,避免喧宾夺主),并且当vdd属性设置成功后,会设置他的值,这个GSL_VTG_MIN_UV、GSL_VTG_MAX_UV一般是由厂商在驱动头文件内设置好的,毕竟硬件也是他们提供的。
int rc;
err = gsl_ts_power_init(ts_data, true);
ts_data->vdd = regulator_get(&ts_data->client->dev,"vdd");//ben.tang 20190912-1 vdd replace ic
if (IS_ERR(ts_data->vdd)) {
rc = PTR_ERR(ts_data->vdd);
dev_err(&ts_data->client->dev,
"Regulator get failed vdd rc=%d\n", rc);
return rc;
}
if (regulator_count_voltages(ts_data->vdd) > 0)
rc = regulator_set_voltage(ts_data->vdd,GSL_I2C_VTG_MIN_UV,GSL_I2C_VTG_MAX_UV);
ts_data->vcc_i2c = regulator_get(&ts_data->client->dev,"vcc_i2c");
if (IS_ERR(ts_data->vcc_i2c)) {
rc = PTR_ERR(ts_data->vcc_i2c);
dev_err(&ts_data->client->dev,
"Regulator get failed vcc-i2c rc=%d\n", rc);
goto reg_vdd_set_vtg;
}
if (regulator_count_voltages(ts_data->vcc_i2c) > 0)
rc = regulator_set_voltage(ts_data->vcc_i2c,GSL_I2C_VTG_MIN_UV,GSL_I2C_VTG_MAX_UV);
供电gpio初始化后,接下来就需要进行使能操作,对我们上面获取到的vdd及vcc_i2c对应的gpio进行使能
err = gsl_ts_power_on(ts_data, true);{
rc = regulator_enable(ts_data->vdd);
if (rc) {
dev_err(&ts_data->client->dev,
"Regulator vdd enable failed rc=%d\n", rc);
return rc;
}
else{
}
udelay(50);
rc = regulator_enable(ts_data->vcc_i2c);
if (rc) {
dev_err(&ts_data->client->dev,
"Regulator vcc_i2c enable failed rc=%d\n", rc);
regulator_disable(ts_data->vdd);
}
else{
}
}
后面的就是input子系统的处理了,这里先不讲。那根据上面我们分析的点,我们的设备树又可以更新了
gsl@40 {
compatible = "silead,gsl-tp";
silead,rst-gpio = <&tlmm 87 0x0>;
silead,irq-gpio = <&tlmm 88 0x2002>;
vdd-supply = <&pm6125_l21>;
vcc_i2c-supply = <&pm6125_l9>;
}
在第三篇我会分析在gsl680驱动内input子系统的操作以及中断队列这两个比较重要的点,如果有不对的地方欢迎大佬指出!