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 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 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 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 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 455e75ea15SMasahiro 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 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 625e75ea15SMasahiro 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 }, 6972640667SWenyou Yang { .compatible = "microchip,24aa02e48", .data = 3 }, 70d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c01a", .data = 3 }, 71d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c02", .data = 3 }, 72d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c04", .data = 4 }, 73d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c08a", .data = 4 }, 74d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c16a", .data = 4 }, 75*de656752SWenyou Yang { .compatible = "atmel,24mac402", .data = 4 }, 76d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c32", .data = 5 }, 77d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c64", .data = 5 }, 78d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c128", .data = 6 }, 79d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c256", .data = 6 }, 80d7e28918Smario.six@gdsys.cc { .compatible = "atmel,24c512", .data = 6 }, 8120142019SSimon Glass { } 8220142019SSimon Glass }; 8320142019SSimon Glass 8420142019SSimon Glass U_BOOT_DRIVER(i2c_eeprom_std) = { 8520142019SSimon Glass .name = "i2c_eeprom", 8620142019SSimon Glass .id = UCLASS_I2C_EEPROM, 8720142019SSimon Glass .of_match = i2c_eeprom_std_ids, 8820142019SSimon Glass .probe = i2c_eeprom_std_probe, 89d7e28918Smario.six@gdsys.cc .ofdata_to_platdata = i2c_eeprom_std_ofdata_to_platdata, 9020142019SSimon Glass .priv_auto_alloc_size = sizeof(struct i2c_eeprom), 9120142019SSimon Glass .ops = &i2c_eeprom_std_ops, 9220142019SSimon Glass }; 9320142019SSimon Glass 9420142019SSimon Glass UCLASS_DRIVER(i2c_eeprom) = { 9520142019SSimon Glass .id = UCLASS_I2C_EEPROM, 9620142019SSimon Glass .name = "i2c_eeprom", 9720142019SSimon Glass }; 98