Skip to content

Commit ba63f99

Browse files
committed
Merge tag 'at24-updates-for-v6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into i2c/for-mergewindow
at24 updates for v6.7 - support the write-lockable pages on two more models - drop at24_get_chip_data() - use the new __counted_by() attribute in struct at24_data
2 parents 3e383dc + 3774740 commit ba63f99

File tree

2 files changed

+16
-30
lines changed

2 files changed

+16
-30
lines changed

Documentation/devicetree/bindings/eeprom/at24.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,14 @@ properties:
6767
pattern: cs16$
6868
- items:
6969
pattern: c32$
70+
- items:
71+
pattern: c32d-wl$
7072
- items:
7173
pattern: cs32$
7274
- items:
7375
pattern: c64$
76+
- items:
77+
pattern: c64d-wl$
7478
- items:
7579
pattern: cs64$
7680
- items:

drivers/misc/eeprom/at24.c

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct at24_data {
9292
* them for us.
9393
*/
9494
u8 bank_addr_shift;
95-
struct regmap *client_regmaps[];
95+
struct regmap *client_regmaps[] __counted_by(num_addresses);
9696
};
9797

9898
/*
@@ -191,9 +191,13 @@ AT24_CHIP_DATA(at24_data_24c16, 16384 / 8, 0);
191191
AT24_CHIP_DATA(at24_data_24cs16, 16,
192192
AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
193193
AT24_CHIP_DATA(at24_data_24c32, 32768 / 8, AT24_FLAG_ADDR16);
194+
/* M24C32-D Additional Write lockable page (M24C32-D order codes) */
195+
AT24_CHIP_DATA(at24_data_24c32d_wlp, 32, AT24_FLAG_ADDR16);
194196
AT24_CHIP_DATA(at24_data_24cs32, 16,
195197
AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
196198
AT24_CHIP_DATA(at24_data_24c64, 65536 / 8, AT24_FLAG_ADDR16);
199+
/* M24C64-D Additional Write lockable page (M24C64-D order codes) */
200+
AT24_CHIP_DATA(at24_data_24c64d_wlp, 32, AT24_FLAG_ADDR16);
197201
AT24_CHIP_DATA(at24_data_24cs64, 16,
198202
AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
199203
AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16);
@@ -222,8 +226,10 @@ static const struct i2c_device_id at24_ids[] = {
222226
{ "24c16", (kernel_ulong_t)&at24_data_24c16 },
223227
{ "24cs16", (kernel_ulong_t)&at24_data_24cs16 },
224228
{ "24c32", (kernel_ulong_t)&at24_data_24c32 },
229+
{ "24c32d-wl", (kernel_ulong_t)&at24_data_24c32d_wlp },
225230
{ "24cs32", (kernel_ulong_t)&at24_data_24cs32 },
226231
{ "24c64", (kernel_ulong_t)&at24_data_24c64 },
232+
{ "24c64-wl", (kernel_ulong_t)&at24_data_24c64d_wlp },
227233
{ "24cs64", (kernel_ulong_t)&at24_data_24cs64 },
228234
{ "24c128", (kernel_ulong_t)&at24_data_24c128 },
229235
{ "24c256", (kernel_ulong_t)&at24_data_24c256 },
@@ -252,8 +258,10 @@ static const struct of_device_id at24_of_match[] = {
252258
{ .compatible = "atmel,24c16", .data = &at24_data_24c16 },
253259
{ .compatible = "atmel,24cs16", .data = &at24_data_24cs16 },
254260
{ .compatible = "atmel,24c32", .data = &at24_data_24c32 },
261+
{ .compatible = "atmel,24c32d-wl", .data = &at24_data_24c32d_wlp },
255262
{ .compatible = "atmel,24cs32", .data = &at24_data_24cs32 },
256263
{ .compatible = "atmel,24c64", .data = &at24_data_24c64 },
264+
{ .compatible = "atmel,24c64d-wl", .data = &at24_data_24c64d_wlp },
257265
{ .compatible = "atmel,24cs64", .data = &at24_data_24cs64 },
258266
{ .compatible = "atmel,24c128", .data = &at24_data_24c128 },
259267
{ .compatible = "atmel,24c256", .data = &at24_data_24c256 },
@@ -509,32 +517,6 @@ static int at24_write(void *priv, unsigned int off, void *val, size_t count)
509517
return 0;
510518
}
511519

512-
static const struct at24_chip_data *at24_get_chip_data(struct device *dev)
513-
{
514-
struct device_node *of_node = dev->of_node;
515-
const struct at24_chip_data *cdata;
516-
const struct i2c_device_id *id;
517-
518-
id = i2c_match_id(at24_ids, to_i2c_client(dev));
519-
520-
/*
521-
* The I2C core allows OF nodes compatibles to match against the
522-
* I2C device ID table as a fallback, so check not only if an OF
523-
* node is present but also if it matches an OF device ID entry.
524-
*/
525-
if (of_node && of_match_device(at24_of_match, dev))
526-
cdata = of_device_get_match_data(dev);
527-
else if (id)
528-
cdata = (void *)id->driver_data;
529-
else
530-
cdata = acpi_device_get_match_data(dev);
531-
532-
if (!cdata)
533-
return ERR_PTR(-ENODEV);
534-
535-
return cdata;
536-
}
537-
538520
static int at24_make_dummy_client(struct at24_data *at24, unsigned int index,
539521
struct i2c_client *base_client,
540522
struct regmap_config *regmap_config)
@@ -601,9 +583,9 @@ static int at24_probe(struct i2c_client *client)
601583
i2c_fn_block = i2c_check_functionality(client->adapter,
602584
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK);
603585

604-
cdata = at24_get_chip_data(dev);
605-
if (IS_ERR(cdata))
606-
return PTR_ERR(cdata);
586+
cdata = i2c_get_match_data(client);
587+
if (!cdata)
588+
return -ENODEV;
607589

608590
err = device_property_read_u32(dev, "pagesize", &page_size);
609591
if (err)

0 commit comments

Comments
 (0)