Skip to content

Commit feb209d

Browse files
claudiubezneaAndrei Simion
authored andcommitted
eeprom: at24: avoid adjusting offset for 24AA025E{48, 64}
The EEPROMs could be used only for MAC storage. In this case the EEPROM areas where MACs resides could be modeled as NVMEM cells (directly via DT bindings) such that the already available networking infrastructure to read properly the MAC addresses (via of_get_mac_address()). The previously available compatibles needs the offset adjustment probably for compatibility w/ old DT bindings. Added "atmel,24mac02e4", "atmel,24mac02e4" compatible for the usage w/ 24AA025E{48, 64} type of EEPROMs. Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com> (cherry picked from commit ab5a2ec) Signed-off-by: Andrei Simion <andrei.simion@microchip.com>
1 parent 5e9df83 commit feb209d

1 file changed

Lines changed: 40 additions & 29 deletions

File tree

drivers/misc/eeprom/at24.c

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,19 @@ struct at24_chip_data {
120120
u32 byte_len;
121121
u8 flags;
122122
u8 bank_addr_shift;
123+
u8 adjoff;
123124
void (*read_post)(unsigned int off, char *buf, size_t count);
124125
};
125126

126-
#define AT24_CHIP_DATA(_name, _len, _flags) \
127+
#define AT24_CHIP_DATA(_name, _len, _flags, _adjoff) \
127128
static const struct at24_chip_data _name = { \
128-
.byte_len = _len, .flags = _flags, \
129+
.byte_len = _len, .flags = _flags, .adjoff = _adjoff, \
129130
}
130131

131-
#define AT24_CHIP_DATA_CB(_name, _len, _flags, _read_post) \
132+
#define AT24_CHIP_DATA_CB(_name, _len, _flags, _adjoff, _read_post) \
132133
static const struct at24_chip_data _name = { \
133134
.byte_len = _len, .flags = _flags, \
135+
.adjoff = _adjoff, \
134136
.read_post = _read_post, \
135137
}
136138

@@ -161,49 +163,53 @@ static void at24_read_post_vaio(unsigned int off, char *buf, size_t count)
161163
}
162164

163165
/* needs 8 addresses as A0-A2 are ignored */
164-
AT24_CHIP_DATA(at24_data_24c00, 128 / 8, AT24_FLAG_TAKE8ADDR);
166+
AT24_CHIP_DATA(at24_data_24c00, 128 / 8, AT24_FLAG_TAKE8ADDR, 0);
165167
/* old variants can't be handled with this generic entry! */
166-
AT24_CHIP_DATA(at24_data_24c01, 1024 / 8, 0);
168+
AT24_CHIP_DATA(at24_data_24c01, 1024 / 8, 0, 0);
167169
AT24_CHIP_DATA(at24_data_24cs01, 16,
168-
AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
169-
AT24_CHIP_DATA(at24_data_24c02, 2048 / 8, 0);
170+
AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
171+
AT24_CHIP_DATA(at24_data_24c02, 2048 / 8, 0, 0);
170172
AT24_CHIP_DATA(at24_data_24cs02, 16,
171-
AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
173+
AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
172174
AT24_CHIP_DATA(at24_data_24mac402, 48 / 8,
173-
AT24_FLAG_MAC | AT24_FLAG_READONLY);
175+
AT24_FLAG_MAC | AT24_FLAG_READONLY, 1);
174176
AT24_CHIP_DATA(at24_data_24mac602, 64 / 8,
175-
AT24_FLAG_MAC | AT24_FLAG_READONLY);
177+
AT24_FLAG_MAC | AT24_FLAG_READONLY, 1);
178+
AT24_CHIP_DATA(at24_data_24mac02e4, 48 / 8,
179+
AT24_FLAG_MAC | AT24_FLAG_READONLY, 0);
180+
AT24_CHIP_DATA(at24_data_24mac02e6, 64 / 8,
181+
AT24_FLAG_MAC | AT24_FLAG_READONLY, 0);
176182
/* spd is a 24c02 in memory DIMMs */
177183
AT24_CHIP_DATA(at24_data_spd, 2048 / 8,
178-
AT24_FLAG_READONLY | AT24_FLAG_IRUGO);
184+
AT24_FLAG_READONLY | AT24_FLAG_IRUGO, 0);
179185
/* 24c02_vaio is a 24c02 on some Sony laptops */
180186
AT24_CHIP_DATA_CB(at24_data_24c02_vaio, 2048 / 8,
181-
AT24_FLAG_READONLY | AT24_FLAG_IRUGO,
187+
AT24_FLAG_READONLY | AT24_FLAG_IRUGO, 0,
182188
at24_read_post_vaio);
183-
AT24_CHIP_DATA(at24_data_24c04, 4096 / 8, 0);
189+
AT24_CHIP_DATA(at24_data_24c04, 4096 / 8, 0, 0);
184190
AT24_CHIP_DATA(at24_data_24cs04, 16,
185-
AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
191+
AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
186192
/* 24rf08 quirk is handled at i2c-core */
187-
AT24_CHIP_DATA(at24_data_24c08, 8192 / 8, 0);
193+
AT24_CHIP_DATA(at24_data_24c08, 8192 / 8, 0, 0);
188194
AT24_CHIP_DATA(at24_data_24cs08, 16,
189-
AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
190-
AT24_CHIP_DATA(at24_data_24c16, 16384 / 8, 0);
195+
AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
196+
AT24_CHIP_DATA(at24_data_24c16, 16384 / 8, 0, 0);
191197
AT24_CHIP_DATA(at24_data_24cs16, 16,
192-
AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
193-
AT24_CHIP_DATA(at24_data_24c32, 32768 / 8, AT24_FLAG_ADDR16);
198+
AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
199+
AT24_CHIP_DATA(at24_data_24c32, 32768 / 8, AT24_FLAG_ADDR16, 0);
194200
AT24_CHIP_DATA(at24_data_24cs32, 16,
195-
AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
196-
AT24_CHIP_DATA(at24_data_24c64, 65536 / 8, AT24_FLAG_ADDR16);
201+
AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
202+
AT24_CHIP_DATA(at24_data_24c64, 65536 / 8, AT24_FLAG_ADDR16, 0);
197203
AT24_CHIP_DATA(at24_data_24cs64, 16,
198-
AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
199-
AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16);
200-
AT24_CHIP_DATA(at24_data_24c256, 262144 / 8, AT24_FLAG_ADDR16);
201-
AT24_CHIP_DATA(at24_data_24c512, 524288 / 8, AT24_FLAG_ADDR16);
202-
AT24_CHIP_DATA(at24_data_24c1024, 1048576 / 8, AT24_FLAG_ADDR16);
204+
AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY, 0);
205+
AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16, 0);
206+
AT24_CHIP_DATA(at24_data_24c256, 262144 / 8, AT24_FLAG_ADDR16, 0);
207+
AT24_CHIP_DATA(at24_data_24c512, 524288 / 8, AT24_FLAG_ADDR16, 0);
208+
AT24_CHIP_DATA(at24_data_24c1024, 1048576 / 8, AT24_FLAG_ADDR16, 0);
209+
AT24_CHIP_DATA(at24_data_24c2048, 2097152 / 8, AT24_FLAG_ADDR16, 0);
203210
AT24_CHIP_DATA_BS(at24_data_24c1025, 1048576 / 8, AT24_FLAG_ADDR16, 2);
204-
AT24_CHIP_DATA(at24_data_24c2048, 2097152 / 8, AT24_FLAG_ADDR16);
205211
/* identical to 24c08 ? */
206-
AT24_CHIP_DATA(at24_data_INT3499, 8192 / 8, 0);
212+
AT24_CHIP_DATA(at24_data_INT3499, 8192 / 8, 0, 0);
207213

208214
static const struct i2c_device_id at24_ids[] = {
209215
{ "24c00", (kernel_ulong_t)&at24_data_24c00 },
@@ -212,7 +218,9 @@ static const struct i2c_device_id at24_ids[] = {
212218
{ "24c02", (kernel_ulong_t)&at24_data_24c02 },
213219
{ "24cs02", (kernel_ulong_t)&at24_data_24cs02 },
214220
{ "24mac402", (kernel_ulong_t)&at24_data_24mac402 },
221+
{ "24mac02e4", (kernel_ulong_t)&at24_data_24mac02e4 },
215222
{ "24mac602", (kernel_ulong_t)&at24_data_24mac602 },
223+
{ "24mac02e6", (kernel_ulong_t)&at24_data_24mac02e6 },
216224
{ "spd", (kernel_ulong_t)&at24_data_spd },
217225
{ "24c02-vaio", (kernel_ulong_t)&at24_data_24c02_vaio },
218226
{ "24c04", (kernel_ulong_t)&at24_data_24c04 },
@@ -243,7 +251,9 @@ static const struct of_device_id at24_of_match[] = {
243251
{ .compatible = "atmel,24c02", .data = &at24_data_24c02 },
244252
{ .compatible = "atmel,24cs02", .data = &at24_data_24cs02 },
245253
{ .compatible = "atmel,24mac402", .data = &at24_data_24mac402 },
254+
{ .compatible = "atmel,24mac02e4", .data = &at24_data_24mac02e4 },
246255
{ .compatible = "atmel,24mac602", .data = &at24_data_24mac602 },
256+
{ .compatible = "atmel,24mac02e6", .data = &at24_data_24mac02e6 },
247257
{ .compatible = "atmel,spd", .data = &at24_data_spd },
248258
{ .compatible = "atmel,24c04", .data = &at24_data_24c04 },
249259
{ .compatible = "atmel,24cs04", .data = &at24_data_24cs04 },
@@ -688,7 +698,8 @@ static int at24_probe(struct i2c_client *client)
688698
at24->read_post = cdata->read_post;
689699
at24->bank_addr_shift = cdata->bank_addr_shift;
690700
at24->num_addresses = num_addresses;
691-
at24->offset_adj = at24_get_offset_adj(flags, byte_len);
701+
at24->offset_adj = cdata->adjoff ?
702+
at24_get_offset_adj(flags, byte_len) : 0;
692703
at24->client_regmaps[0] = regmap;
693704

694705
at24->vcc_reg = devm_regulator_get(dev, "vcc");

0 commit comments

Comments
 (0)