1818
1919#define GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN 1
2020#define GOODIX_BERLIN_REGISTER_WIDTH 4
21- #define GOODIX_BERLIN_SPI_READ_DUMMY_LEN 3
22- #define GOODIX_BERLIN_SPI_READ_PREFIX_LEN (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
21+ #define GOODIX_BERLIN_SPI_READ_DUMMY_LEN_A 4
22+ #define GOODIX_BERLIN_SPI_READ_DUMMY_LEN_D 3
23+ #define GOODIX_BERLIN_SPI_READ_PREFIX_LEN_A (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
2324 GOODIX_BERLIN_REGISTER_WIDTH + \
24- GOODIX_BERLIN_SPI_READ_DUMMY_LEN)
25+ GOODIX_BERLIN_SPI_READ_DUMMY_LEN_A)
26+ #define GOODIX_BERLIN_SPI_READ_PREFIX_LEN_D (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
27+ GOODIX_BERLIN_REGISTER_WIDTH + \
28+ GOODIX_BERLIN_SPI_READ_DUMMY_LEN_D)
2529#define GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
2630 GOODIX_BERLIN_REGISTER_WIDTH)
2731
@@ -33,6 +37,7 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
3337 size_t val_size )
3438{
3539 struct spi_device * spi = context ;
40+ const struct goodix_berlin_ic_data * ic_data = spi_get_device_match_data (spi );
3641 struct spi_transfer xfers ;
3742 struct spi_message spi_msg ;
3843 const u32 * reg = reg_buf ; /* reg is stored as native u32 at start of buffer */
@@ -42,23 +47,22 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
4247 return - EINVAL ;
4348
4449 u8 * buf __free (kfree ) =
45- kzalloc (GOODIX_BERLIN_SPI_READ_PREFIX_LEN + val_size ,
46- GFP_KERNEL );
50+ kzalloc (ic_data -> read_prefix_len + val_size , GFP_KERNEL );
4751 if (!buf )
4852 return - ENOMEM ;
4953
5054 spi_message_init (& spi_msg );
5155 memset (& xfers , 0 , sizeof (xfers ));
5256
53- /* buffer format: 0xF1 + addr(4bytes) + dummy(3bytes ) + data */
57+ /* buffer format: 0xF1 + addr(4bytes) + dummy(3/4bytes ) + data */
5458 buf [0 ] = GOODIX_BERLIN_SPI_READ_FLAG ;
5559 put_unaligned_be32 (* reg , buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN );
5660 memset (buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + GOODIX_BERLIN_REGISTER_WIDTH ,
57- 0xff , GOODIX_BERLIN_SPI_READ_DUMMY_LEN );
61+ 0xff , ic_data -> read_dummy_len );
5862
5963 xfers .tx_buf = buf ;
6064 xfers .rx_buf = buf ;
61- xfers .len = GOODIX_BERLIN_SPI_READ_PREFIX_LEN + val_size ;
65+ xfers .len = ic_data -> read_prefix_len + val_size ;
6266 xfers .cs_change = 0 ;
6367 spi_message_add_tail (& xfers , & spi_msg );
6468
@@ -68,7 +72,7 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
6872 return error ;
6973 }
7074
71- memcpy (val_buf , buf + GOODIX_BERLIN_SPI_READ_PREFIX_LEN , val_size );
75+ memcpy (val_buf , buf + ic_data -> read_prefix_len , val_size );
7276 return error ;
7377}
7478
@@ -123,6 +127,7 @@ static const struct input_id goodix_berlin_spi_input_id = {
123127
124128static int goodix_berlin_spi_probe (struct spi_device * spi )
125129{
130+ const struct goodix_berlin_ic_data * ic_data = spi_get_device_match_data (spi );
126131 struct regmap_config regmap_config ;
127132 struct regmap * regmap ;
128133 size_t max_size ;
@@ -137,29 +142,46 @@ static int goodix_berlin_spi_probe(struct spi_device *spi)
137142 max_size = spi_max_transfer_size (spi );
138143
139144 regmap_config = goodix_berlin_spi_regmap_conf ;
140- regmap_config .max_raw_read = max_size - GOODIX_BERLIN_SPI_READ_PREFIX_LEN ;
145+ regmap_config .max_raw_read = max_size - ic_data -> read_prefix_len ;
141146 regmap_config .max_raw_write = max_size - GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN ;
142147
143148 regmap = devm_regmap_init (& spi -> dev , NULL , spi , & regmap_config );
144149 if (IS_ERR (regmap ))
145150 return PTR_ERR (regmap );
146151
147152 error = goodix_berlin_probe (& spi -> dev , spi -> irq ,
148- & goodix_berlin_spi_input_id , regmap );
153+ & goodix_berlin_spi_input_id , regmap ,
154+ ic_data );
149155 if (error )
150156 return error ;
151157
152158 return 0 ;
153159}
154160
161+ static const struct goodix_berlin_ic_data gt9897_data = {
162+ .fw_version_info_addr = GOODIX_BERLIN_FW_VERSION_INFO_ADDR_A ,
163+ .ic_info_addr = GOODIX_BERLIN_IC_INFO_ADDR_A ,
164+ .read_dummy_len = GOODIX_BERLIN_SPI_READ_DUMMY_LEN_A ,
165+ .read_prefix_len = GOODIX_BERLIN_SPI_READ_PREFIX_LEN_A ,
166+ };
167+
168+ static const struct goodix_berlin_ic_data gt9916_data = {
169+ .fw_version_info_addr = GOODIX_BERLIN_FW_VERSION_INFO_ADDR_D ,
170+ .ic_info_addr = GOODIX_BERLIN_IC_INFO_ADDR_D ,
171+ .read_dummy_len = GOODIX_BERLIN_SPI_READ_DUMMY_LEN_D ,
172+ .read_prefix_len = GOODIX_BERLIN_SPI_READ_PREFIX_LEN_D ,
173+ };
174+
155175static const struct spi_device_id goodix_berlin_spi_ids [] = {
156- { "gt9916" },
176+ { .name = "gt9897" , .driver_data = (long )& gt9897_data },
177+ { .name = "gt9916" , .driver_data = (long )& gt9916_data },
157178 { },
158179};
159180MODULE_DEVICE_TABLE (spi , goodix_berlin_spi_ids );
160181
161182static const struct of_device_id goodix_berlin_spi_of_match [] = {
162- { .compatible = "goodix,gt9916" , },
183+ { .compatible = "goodix,gt9897" , .data = & gt9897_data },
184+ { .compatible = "goodix,gt9916" , .data = & gt9916_data },
163185 { }
164186};
165187MODULE_DEVICE_TABLE (of , goodix_berlin_spi_of_match );
0 commit comments