@@ -91,6 +91,7 @@ struct at24_data {
91
91
* Some chips tie up multiple I2C addresses; dummy devices reserve
92
92
* them for us.
93
93
*/
94
+ u8 bank_addr_shift ;
94
95
struct regmap * client_regmaps [];
95
96
};
96
97
@@ -118,6 +119,7 @@ MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)");
118
119
struct at24_chip_data {
119
120
u32 byte_len ;
120
121
u8 flags ;
122
+ u8 bank_addr_shift ;
121
123
void (* read_post )(unsigned int off , char * buf , size_t count );
122
124
};
123
125
@@ -132,6 +134,12 @@ struct at24_chip_data {
132
134
.read_post = _read_post, \
133
135
}
134
136
137
+ #define AT24_CHIP_DATA_BS (_name , _len , _flags , _bank_addr_shift ) \
138
+ static const struct at24_chip_data _name = { \
139
+ .byte_len = _len, .flags = _flags, \
140
+ .bank_addr_shift = _bank_addr_shift \
141
+ }
142
+
135
143
static void at24_read_post_vaio (unsigned int off , char * buf , size_t count )
136
144
{
137
145
int i ;
@@ -192,6 +200,7 @@ AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16);
192
200
AT24_CHIP_DATA (at24_data_24c256 , 262144 / 8 , AT24_FLAG_ADDR16 );
193
201
AT24_CHIP_DATA (at24_data_24c512 , 524288 / 8 , AT24_FLAG_ADDR16 );
194
202
AT24_CHIP_DATA (at24_data_24c1024 , 1048576 / 8 , AT24_FLAG_ADDR16 );
203
+ AT24_CHIP_DATA_BS (at24_data_24c1025 , 1048576 / 8 , AT24_FLAG_ADDR16 , 2 );
195
204
AT24_CHIP_DATA (at24_data_24c2048 , 2097152 / 8 , AT24_FLAG_ADDR16 );
196
205
/* identical to 24c08 ? */
197
206
AT24_CHIP_DATA (at24_data_INT3499 , 8192 / 8 , 0 );
@@ -220,6 +229,7 @@ static const struct i2c_device_id at24_ids[] = {
220
229
{ "24c256" , (kernel_ulong_t )& at24_data_24c256 },
221
230
{ "24c512" , (kernel_ulong_t )& at24_data_24c512 },
222
231
{ "24c1024" , (kernel_ulong_t )& at24_data_24c1024 },
232
+ { "24c1025" , (kernel_ulong_t )& at24_data_24c1025 },
223
233
{ "24c2048" , (kernel_ulong_t )& at24_data_24c2048 },
224
234
{ "at24" , 0 },
225
235
{ /* END OF LIST */ }
@@ -249,6 +259,7 @@ static const struct of_device_id at24_of_match[] = {
249
259
{ .compatible = "atmel,24c256" , .data = & at24_data_24c256 },
250
260
{ .compatible = "atmel,24c512" , .data = & at24_data_24c512 },
251
261
{ .compatible = "atmel,24c1024" , .data = & at24_data_24c1024 },
262
+ { .compatible = "atmel,24c1025" , .data = & at24_data_24c1025 },
252
263
{ .compatible = "atmel,24c2048" , .data = & at24_data_24c2048 },
253
264
{ /* END OF LIST */ },
254
265
};
@@ -533,7 +544,8 @@ static int at24_make_dummy_client(struct at24_data *at24, unsigned int index,
533
544
534
545
dummy_client = devm_i2c_new_dummy_device (& base_client -> dev ,
535
546
base_client -> adapter ,
536
- base_client -> addr + index );
547
+ base_client -> addr +
548
+ (index << at24 -> bank_addr_shift ));
537
549
if (IS_ERR (dummy_client ))
538
550
return PTR_ERR (dummy_client );
539
551
@@ -674,6 +686,7 @@ static int at24_probe(struct i2c_client *client)
674
686
at24 -> page_size = page_size ;
675
687
at24 -> flags = flags ;
676
688
at24 -> read_post = cdata -> read_post ;
689
+ at24 -> bank_addr_shift = cdata -> bank_addr_shift ;
677
690
at24 -> num_addresses = num_addresses ;
678
691
at24 -> offset_adj = at24_get_offset_adj (flags , byte_len );
679
692
at24 -> client_regmaps [0 ] = regmap ;
0 commit comments