1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2014 Google, Inc 4 */ 5 6 #include <common.h> 7 #include <linux/err.h> 8 #include <dm.h> 9 #include <i2c.h> 10 #include <i2c_eeprom.h> 11 12 int i2c_eeprom_read(struct udevice *dev, int offset, uint8_t *buf, int size) 13 { 14 const struct i2c_eeprom_ops *ops = device_get_ops(dev); 15 16 if (!ops->read) 17 return -ENOSYS; 18 19 return ops->read(dev, offset, buf, size); 20 } 21 22 int i2c_eeprom_write(struct udevice *dev, int offset, uint8_t *buf, int size) 23 { 24 const struct i2c_eeprom_ops *ops = device_get_ops(dev); 25 26 if (!ops->write) 27 return -ENOSYS; 28 29 return ops->write(dev, offset, buf, size); 30 } 31 32 static int i2c_eeprom_std_read(struct udevice *dev, int offset, uint8_t *buf, 33 int size) 34 { 35 return dm_i2c_read(dev, offset, buf, size); 36 } 37 38 static int i2c_eeprom_std_write(struct udevice *dev, int offset, 39 const uint8_t *buf, int size) 40 { 41 return -ENODEV; 42 } 43 44 static const struct i2c_eeprom_ops i2c_eeprom_std_ops = { 45 .read = i2c_eeprom_std_read, 46 .write = i2c_eeprom_std_write, 47 }; 48 49 static int i2c_eeprom_std_ofdata_to_platdata(struct udevice *dev) 50 { 51 struct i2c_eeprom *priv = dev_get_priv(dev); 52 u64 data = dev_get_driver_data(dev); 53 54 /* 6 bit -> page size of up to 2^63 (should be sufficient) */ 55 priv->pagewidth = data & 0x3F; 56 priv->pagesize = (1 << priv->pagewidth); 57 58 return 0; 59 } 60 61 static int i2c_eeprom_std_probe(struct udevice *dev) 62 { 63 return 0; 64 } 65 66 static const struct udevice_id i2c_eeprom_std_ids[] = { 67 { .compatible = "i2c-eeprom", .data = 0 }, 68 { .compatible = "microchip,24aa02e48", .data = 3 }, 69 { .compatible = "atmel,24c01a", .data = 3 }, 70 { .compatible = "atmel,24c02", .data = 3 }, 71 { .compatible = "atmel,24c04", .data = 4 }, 72 { .compatible = "atmel,24c08", .data = 4 }, 73 { .compatible = "atmel,24c08a", .data = 4 }, 74 { .compatible = "atmel,24c16a", .data = 4 }, 75 { .compatible = "atmel,24mac402", .data = 4 }, 76 { .compatible = "atmel,24c32", .data = 5 }, 77 { .compatible = "atmel,24c64", .data = 5 }, 78 { .compatible = "atmel,24c128", .data = 6 }, 79 { .compatible = "atmel,24c256", .data = 6 }, 80 { .compatible = "atmel,24c512", .data = 6 }, 81 { } 82 }; 83 84 U_BOOT_DRIVER(i2c_eeprom_std) = { 85 .name = "i2c_eeprom", 86 .id = UCLASS_I2C_EEPROM, 87 .of_match = i2c_eeprom_std_ids, 88 .probe = i2c_eeprom_std_probe, 89 .ofdata_to_platdata = i2c_eeprom_std_ofdata_to_platdata, 90 .priv_auto_alloc_size = sizeof(struct i2c_eeprom), 91 .ops = &i2c_eeprom_std_ops, 92 }; 93 94 UCLASS_DRIVER(i2c_eeprom) = { 95 .id = UCLASS_I2C_EEPROM, 96 .name = "i2c_eeprom", 97 }; 98