18
18
19
19
#define GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN 1
20
20
#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 + \
23
24
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)
25
29
#define GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN (GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN + \
26
30
GOODIX_BERLIN_REGISTER_WIDTH)
27
31
@@ -33,6 +37,7 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
33
37
size_t val_size )
34
38
{
35
39
struct spi_device * spi = context ;
40
+ const struct goodix_berlin_ic_data * ic_data = spi_get_device_match_data (spi );
36
41
struct spi_transfer xfers ;
37
42
struct spi_message spi_msg ;
38
43
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,
42
47
return - EINVAL ;
43
48
44
49
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 );
47
51
if (!buf )
48
52
return - ENOMEM ;
49
53
50
54
spi_message_init (& spi_msg );
51
55
memset (& xfers , 0 , sizeof (xfers ));
52
56
53
- /* buffer format: 0xF1 + addr(4bytes) + dummy(3bytes ) + data */
57
+ /* buffer format: 0xF1 + addr(4bytes) + dummy(3/4bytes ) + data */
54
58
buf [0 ] = GOODIX_BERLIN_SPI_READ_FLAG ;
55
59
put_unaligned_be32 (* reg , buf + GOODIX_BERLIN_SPI_TRANS_PREFIX_LEN );
56
60
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 );
58
62
59
63
xfers .tx_buf = buf ;
60
64
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 ;
62
66
xfers .cs_change = 0 ;
63
67
spi_message_add_tail (& xfers , & spi_msg );
64
68
@@ -68,7 +72,7 @@ static int goodix_berlin_spi_read(void *context, const void *reg_buf,
68
72
return error ;
69
73
}
70
74
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 );
72
76
return error ;
73
77
}
74
78
@@ -123,6 +127,7 @@ static const struct input_id goodix_berlin_spi_input_id = {
123
127
124
128
static int goodix_berlin_spi_probe (struct spi_device * spi )
125
129
{
130
+ const struct goodix_berlin_ic_data * ic_data = spi_get_device_match_data (spi );
126
131
struct regmap_config regmap_config ;
127
132
struct regmap * regmap ;
128
133
size_t max_size ;
@@ -137,29 +142,46 @@ static int goodix_berlin_spi_probe(struct spi_device *spi)
137
142
max_size = spi_max_transfer_size (spi );
138
143
139
144
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 ;
141
146
regmap_config .max_raw_write = max_size - GOODIX_BERLIN_SPI_WRITE_PREFIX_LEN ;
142
147
143
148
regmap = devm_regmap_init (& spi -> dev , NULL , spi , & regmap_config );
144
149
if (IS_ERR (regmap ))
145
150
return PTR_ERR (regmap );
146
151
147
152
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 );
149
155
if (error )
150
156
return error ;
151
157
152
158
return 0 ;
153
159
}
154
160
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
+
155
175
static 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 },
157
178
{ },
158
179
};
159
180
MODULE_DEVICE_TABLE (spi , goodix_berlin_spi_ids );
160
181
161
182
static 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 },
163
185
{ }
164
186
};
165
187
MODULE_DEVICE_TABLE (of , goodix_berlin_spi_of_match );
0 commit comments