120142019SSimon Glass /*
220142019SSimon Glass * Copyright (c) 2014 Google, Inc
320142019SSimon Glass *
420142019SSimon Glass * SPDX-License-Identifier: GPL-2.0+
520142019SSimon Glass */
620142019SSimon Glass
720142019SSimon Glass #include <common.h>
8ee5ee876SMasahiro Yamada #include <linux/err.h>
920142019SSimon Glass #include <dm.h>
1020142019SSimon Glass #include <i2c.h>
1120142019SSimon Glass #include <i2c_eeprom.h>
1220142019SSimon Glass
i2c_eeprom_read(struct udevice * dev,int offset,uint8_t * buf,int size)138880efbdSJonas Karlman int i2c_eeprom_read(struct udevice *dev, int offset, uint8_t *buf, int size)
148880efbdSJonas Karlman {
158880efbdSJonas Karlman const struct i2c_eeprom_ops *ops = device_get_ops(dev);
168880efbdSJonas Karlman
178880efbdSJonas Karlman if (!ops->read)
188880efbdSJonas Karlman return -ENOSYS;
198880efbdSJonas Karlman
208880efbdSJonas Karlman return ops->read(dev, offset, buf, size);
218880efbdSJonas Karlman }
228880efbdSJonas Karlman
i2c_eeprom_write(struct udevice * dev,int offset,uint8_t * buf,int size)238880efbdSJonas Karlman int i2c_eeprom_write(struct udevice *dev, int offset, uint8_t *buf, int size)
248880efbdSJonas Karlman {
258880efbdSJonas Karlman const struct i2c_eeprom_ops *ops = device_get_ops(dev);
268880efbdSJonas Karlman
278880efbdSJonas Karlman if (!ops->write)
288880efbdSJonas Karlman return -ENOSYS;
298880efbdSJonas Karlman
308880efbdSJonas Karlman return ops->write(dev, offset, buf, size);
318880efbdSJonas Karlman }
328880efbdSJonas Karlman
i2c_eeprom_std_read(struct udevice * dev,int offset,uint8_t * buf,int size)338880efbdSJonas Karlman static int i2c_eeprom_std_read(struct udevice *dev, int offset, uint8_t *buf,
3420142019SSimon Glass int size)
3520142019SSimon Glass {
36d7e28918Smario.six@gdsys.cc return dm_i2c_read(dev, offset, buf, size);
3720142019SSimon Glass }
3820142019SSimon Glass
i2c_eeprom_std_write(struct udevice * dev,int offset,const uint8_t * buf,int size)398880efbdSJonas Karlman static int i2c_eeprom_std_write(struct udevice *dev, int offset,
4020142019SSimon Glass const uint8_t *buf, int size)
4120142019SSimon Glass {
4220142019SSimon Glass return -ENODEV;
4320142019SSimon Glass }
4420142019SSimon Glass
45*5e75ea15SMasahiro Yamada static const struct i2c_eeprom_ops i2c_eeprom_std_ops = {
468880efbdSJonas Karlman .read = i2c_eeprom_std_read,
478880efbdSJonas Karlman .write = i2c_eeprom_std_write,
4820142019SSimon Glass };
4920142019SSimon Glass
i2c_eeprom_std_ofdata_to_platdata(struct udevice * dev)50d7e28918Smario.six@gdsys.cc static int i2c_eeprom_std_ofdata_to_platdata(struct udevice *dev)
51d7e28918Smario.six@gdsys.cc {
52d7e28918Smario.six@gdsys.cc struct i2c_eeprom *priv = dev_get_priv(dev);
53d7e28918Smario.six@gdsys.cc u64 data = dev_get_driver_data(dev);
54d7e28918Smario.six@gdsys.cc
55d7e28918Smario.six@gdsys.cc /* 6 bit -> page size of up to 2^63 (should be sufficient) */
56d7e28918Smario.six@gdsys.cc priv->pagewidth = data & 0x3F;
57d7e28918Smario.six@gdsys.cc priv->pagesize = (1 << priv->pagewidth);
58d7e28918Smario.six@gdsys.cc
59d7e28918Smario.six@gdsys.cc return 0;
60d7e28918Smario.six@gdsys.cc }
61d7e28918Smario.six@gdsys.cc
i2c_eeprom_std_probe(struct udevice * dev)62*5e75ea15SMasahiro Yamada static int i2c_eeprom_std_probe(struct udevice *dev)
6320142019SSimon Glass {
6420142019SSimon Glass return 0;
6520142019SSimon Glass }
6620142019SSimon Glass
6720142019SSimon Glass static const struct udevice_id i2c_eeprom_std_ids[] = {
68d7e28918Smario.six@gdsys.cc { .compatible = "i2c-eeprom", .data = 0 },
69d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c01a", .data = 3 },
70d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c02", .data = 3 },
71d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c04", .data = 4 },
72d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c08a", .data = 4 },
73d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c16a", .data = 4 },
74d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c32", .data = 5 },
75d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c64", .data = 5 },
76d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c128", .data = 6 },
77d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c256", .data = 6 },
78d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c512", .data = 6 },
7920142019SSimon Glass { }
8020142019SSimon Glass };
8120142019SSimon Glass
8220142019SSimon Glass U_BOOT_DRIVER(i2c_eeprom_std) = {
8320142019SSimon Glass .name = "i2c_eeprom",
8420142019SSimon Glass .id = UCLASS_I2C_EEPROM,
8520142019SSimon Glass .of_match = i2c_eeprom_std_ids,
8620142019SSimon Glass .probe = i2c_eeprom_std_probe,
87d7e28918Smario.six@gdsys.cc .ofdata_to_platdata = i2c_eeprom_std_ofdata_to_platdata,
8820142019SSimon Glass .priv_auto_alloc_size = sizeof(struct i2c_eeprom),
8920142019SSimon Glass .ops = &i2c_eeprom_std_ops,
9020142019SSimon Glass };
9120142019SSimon Glass
9220142019SSimon Glass UCLASS_DRIVER(i2c_eeprom) = {
9320142019SSimon Glass .id = UCLASS_I2C_EEPROM,
9420142019SSimon Glass .name = "i2c_eeprom",
9520142019SSimon Glass };
96