]> git.sur5r.net Git - u-boot/commitdiff
i2c_eeprom: Add reading support
authormario.six@gdsys.cc <mario.six@gdsys.cc>
Wed, 22 Jun 2016 13:14:16 +0000 (15:14 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 22 Jul 2016 13:52:59 +0000 (09:52 -0400)
This patch implements the reading functionality for the generic I2C
EEPROM driver, which was just a non-functional stub until now.

Since the page size will be of importance for the writing support, we
add suitable members to the private data structure to keep track of it.

Compatibility strings for a range of at24c* chips are added.

Signed-off-by: Mario Six <mario.six@gdsys.cc>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/misc/Kconfig
drivers/misc/i2c_eeprom.c
include/i2c_eeprom.h

index 2373037685c2762558fe1c3993057d7fdb7d298d..b84e351da7cf86c7c29ef7bed32afc99f7520053 100644 (file)
@@ -144,4 +144,9 @@ config QFW
          Hidden option to enable QEMU fw_cfg interface. This will be selected by
          either CONFIG_CMD_QFW or CONFIG_GENERATE_ACPI_TABLE.
 
+config I2C_EEPROM
+       bool "Enable driver for generic I2C-attached EEPROMs"
+       depends on MISC
+       help
+         Enable a generic driver for EEPROMs attached via I2C.
 endmenu
index 814134a2cb1e076747464098e50fc06a160d10bf..c9f4174bad42f928e707e7a2570e24a827bca536 100644 (file)
@@ -13,7 +13,7 @@
 static int i2c_eeprom_read(struct udevice *dev, int offset, uint8_t *buf,
                           int size)
 {
-       return -ENODEV;
+       return dm_i2c_read(dev, offset, buf, size);
 }
 
 static int i2c_eeprom_write(struct udevice *dev, int offset,
@@ -27,23 +27,46 @@ struct i2c_eeprom_ops i2c_eeprom_std_ops = {
        .write  = i2c_eeprom_write,
 };
 
+static int i2c_eeprom_std_ofdata_to_platdata(struct udevice *dev)
+{
+       struct i2c_eeprom *priv = dev_get_priv(dev);
+       u64 data = dev_get_driver_data(dev);
+
+       /* 6 bit -> page size of up to 2^63 (should be sufficient) */
+       priv->pagewidth = data & 0x3F;
+       priv->pagesize = (1 << priv->pagewidth);
+
+       return 0;
+}
+
 int i2c_eeprom_std_probe(struct udevice *dev)
 {
        return 0;
 }
 
 static const struct udevice_id i2c_eeprom_std_ids[] = {
-       { .compatible = "i2c-eeprom" },
+       { .compatible = "i2c-eeprom", .data = 0 },
+       { .compatible = "atmel,24c01a", .data = 3 },
+       { .compatible = "atmel,24c02", .data = 3 },
+       { .compatible = "atmel,24c04", .data = 4 },
+       { .compatible = "atmel,24c08a", .data = 4 },
+       { .compatible = "atmel,24c16a", .data = 4 },
+       { .compatible = "atmel,24c32", .data = 5 },
+       { .compatible = "atmel,24c64", .data = 5 },
+       { .compatible = "atmel,24c128", .data = 6 },
+       { .compatible = "atmel,24c256", .data = 6 },
+       { .compatible = "atmel,24c512", .data = 6 },
        { }
 };
 
 U_BOOT_DRIVER(i2c_eeprom_std) = {
-       .name           = "i2c_eeprom",
-       .id             = UCLASS_I2C_EEPROM,
-       .of_match       = i2c_eeprom_std_ids,
-       .probe          = i2c_eeprom_std_probe,
-       .priv_auto_alloc_size = sizeof(struct i2c_eeprom),
-       .ops            = &i2c_eeprom_std_ops,
+       .name                   = "i2c_eeprom",
+       .id                     = UCLASS_I2C_EEPROM,
+       .of_match               = i2c_eeprom_std_ids,
+       .probe                  = i2c_eeprom_std_probe,
+       .ofdata_to_platdata     = i2c_eeprom_std_ofdata_to_platdata,
+       .priv_auto_alloc_size   = sizeof(struct i2c_eeprom),
+       .ops                    = &i2c_eeprom_std_ops,
 };
 
 UCLASS_DRIVER(i2c_eeprom) = {
index ea6c962a3932f3bc7a28276a93e2bc9c45f2a2cf..04528928126606807f477cd3bac0dfae6c69cd84 100644 (file)
@@ -14,6 +14,10 @@ struct i2c_eeprom_ops {
 };
 
 struct i2c_eeprom {
+       /* The EEPROM's page size in byte */
+       unsigned long pagesize;
+       /* The EEPROM's page width in bits (pagesize = 2^pagewidth) */
+       unsigned pagewidth;
 };
 
 #endif