@@ -79,6 +79,13 @@ struct goodix_chip_data {
79
79
void (* calc_config_checksum )(struct goodix_ts_data * ts );
80
80
};
81
81
82
+ struct goodix_chip_id {
83
+ const char * id ;
84
+ const struct goodix_chip_data * data ;
85
+ };
86
+
87
+ #define GOODIX_ID_MAX_LEN 4
88
+
82
89
struct goodix_ts_data {
83
90
struct i2c_client * client ;
84
91
struct input_dev * input_dev ;
@@ -92,7 +99,7 @@ struct goodix_ts_data {
92
99
struct gpio_desc * gpiod_rst ;
93
100
int gpio_count ;
94
101
int gpio_int_idx ;
95
- u16 id ;
102
+ char id [ GOODIX_ID_MAX_LEN + 1 ] ;
96
103
u16 version ;
97
104
const char * cfg_name ;
98
105
bool reset_controller_at_probe ;
@@ -140,6 +147,22 @@ static const struct goodix_chip_data gt9x_chip_data = {
140
147
.calc_config_checksum = goodix_calc_cfg_checksum_8 ,
141
148
};
142
149
150
+ static const struct goodix_chip_id goodix_chip_ids [] = {
151
+ { .id = "1151" , .data = & gt1x_chip_data },
152
+ { .id = "5663" , .data = & gt1x_chip_data },
153
+ { .id = "5688" , .data = & gt1x_chip_data },
154
+
155
+ { .id = "911" , .data = & gt911_chip_data },
156
+ { .id = "9271" , .data = & gt911_chip_data },
157
+ { .id = "9110" , .data = & gt911_chip_data },
158
+ { .id = "927" , .data = & gt911_chip_data },
159
+ { .id = "928" , .data = & gt911_chip_data },
160
+
161
+ { .id = "912" , .data = & gt967_chip_data },
162
+ { .id = "967" , .data = & gt967_chip_data },
163
+ { }
164
+ };
165
+
143
166
static const unsigned long goodix_irq_flags [] = {
144
167
IRQ_TYPE_EDGE_RISING ,
145
168
IRQ_TYPE_EDGE_FALLING ,
@@ -276,28 +299,16 @@ static int goodix_i2c_write_u8(struct i2c_client *client, u16 reg, u8 value)
276
299
return goodix_i2c_write (client , reg , & value , sizeof (value ));
277
300
}
278
301
279
- static const struct goodix_chip_data * goodix_get_chip_data (u16 id )
302
+ static const struct goodix_chip_data * goodix_get_chip_data (const char * id )
280
303
{
281
- switch (id ) {
282
- case 1151 :
283
- case 5663 :
284
- case 5688 :
285
- return & gt1x_chip_data ;
286
-
287
- case 911 :
288
- case 9271 :
289
- case 9110 :
290
- case 927 :
291
- case 928 :
292
- return & gt911_chip_data ;
293
-
294
- case 912 :
295
- case 967 :
296
- return & gt967_chip_data ;
304
+ unsigned int i ;
297
305
298
- default :
299
- return & gt9x_chip_data ;
306
+ for (i = 0 ; goodix_chip_ids [i ].id ; i ++ ) {
307
+ if (!strcmp (goodix_chip_ids [i ].id , id ))
308
+ return goodix_chip_ids [i ].data ;
300
309
}
310
+
311
+ return & gt9x_chip_data ;
301
312
}
302
313
303
314
static int goodix_ts_read_input_report (struct goodix_ts_data * ts , u8 * data )
@@ -951,22 +962,21 @@ static int goodix_read_version(struct goodix_ts_data *ts)
951
962
{
952
963
int error ;
953
964
u8 buf [6 ];
954
- char id_str [5 ];
965
+ char id_str [GOODIX_ID_MAX_LEN + 1 ];
955
966
956
967
error = goodix_i2c_read (ts -> client , GOODIX_REG_ID , buf , sizeof (buf ));
957
968
if (error ) {
958
969
dev_err (& ts -> client -> dev , "read version failed: %d\n" , error );
959
970
return error ;
960
971
}
961
972
962
- memcpy (id_str , buf , 4 );
963
- id_str [4 ] = 0 ;
964
- if (kstrtou16 (id_str , 10 , & ts -> id ))
965
- ts -> id = 0x1001 ;
973
+ memcpy (id_str , buf , GOODIX_ID_MAX_LEN );
974
+ id_str [GOODIX_ID_MAX_LEN ] = 0 ;
975
+ strscpy (ts -> id , id_str , GOODIX_ID_MAX_LEN + 1 );
966
976
967
977
ts -> version = get_unaligned_le16 (& buf [4 ]);
968
978
969
- dev_info (& ts -> client -> dev , "ID %d , version: %04x\n" , ts -> id ,
979
+ dev_info (& ts -> client -> dev , "ID %s , version: %04x\n" , ts -> id ,
970
980
ts -> version );
971
981
972
982
return 0 ;
@@ -1025,7 +1035,8 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
1025
1035
ts -> input_dev -> phys = "input/ts" ;
1026
1036
ts -> input_dev -> id .bustype = BUS_I2C ;
1027
1037
ts -> input_dev -> id .vendor = 0x0416 ;
1028
- ts -> input_dev -> id .product = ts -> id ;
1038
+ if (kstrtou16 (ts -> id , 10 , & ts -> input_dev -> id .product ))
1039
+ ts -> input_dev -> id .product = 0x1001 ;
1029
1040
ts -> input_dev -> id .version = ts -> version ;
1030
1041
1031
1042
ts -> input_dev -> keycode = ts -> keymap ;
@@ -1228,7 +1239,7 @@ static int goodix_ts_probe(struct i2c_client *client,
1228
1239
if (ts -> load_cfg_from_disk ) {
1229
1240
/* update device config */
1230
1241
ts -> cfg_name = devm_kasprintf (& client -> dev , GFP_KERNEL ,
1231
- "goodix_%d_cfg .bin" , ts -> id );
1242
+ "goodix_%s_cfg .bin" , ts -> id );
1232
1243
if (!ts -> cfg_name )
1233
1244
return - ENOMEM ;
1234
1245
0 commit comments