projects
/
platform
/
kernel
/
u-boot.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'u-boot-imx-20200825' of https://gitlab.denx.de/u-boot/custodians/u-boot-imx
[platform/kernel/u-boot.git]
/
drivers
/
misc
/
i2c_eeprom.c
diff --git
a/drivers/misc/i2c_eeprom.c
b/drivers/misc/i2c_eeprom.c
index
934f820
..
3651ba4
100644
(file)
--- a/
drivers/misc/i2c_eeprom.c
+++ b/
drivers/misc/i2c_eeprom.c
@@
-5,6
+5,7
@@
#include <common.h>
#include <eeprom.h>
#include <common.h>
#include <eeprom.h>
+#include <linux/delay.h>
#include <linux/err.h>
#include <linux/kernel.h>
#include <dm.h>
#include <linux/err.h>
#include <linux/kernel.h>
#include <dm.h>
@@
-14,7
+15,10
@@
struct i2c_eeprom_drv_data {
u32 size; /* size in bytes */
struct i2c_eeprom_drv_data {
u32 size; /* size in bytes */
- u32 pagewidth; /* pagesize = 2^pagewidth */
+ u32 pagesize; /* page size in bytes */
+ u32 addr_offset_mask; /* bits in addr used for offset overflow */
+ u32 offset_len; /* size in bytes of offset */
+ u32 start_offset; /* valid start offset inside memory, by default 0 */
};
int i2c_eeprom_read(struct udevice *dev, int offset, uint8_t *buf, int size)
};
int i2c_eeprom_read(struct udevice *dev, int offset, uint8_t *buf, int size)
@@
-97,13
+101,11
@@
static int i2c_eeprom_std_ofdata_to_platdata(struct udevice *dev)
u32 pagesize;
u32 size;
u32 pagesize;
u32 size;
- if (dev_read_u32(dev, "pagesize", &pagesize) == 0)
{
+ if (dev_read_u32(dev, "pagesize", &pagesize) == 0)
priv->pagesize = pagesize;
priv->pagesize = pagesize;
- } else {
+ else
/* 6 bit -> page size of up to 2^63 (should be sufficient) */
/* 6 bit -> page size of up to 2^63 (should be sufficient) */
- priv->pagewidth = data->pagewidth;
- priv->pagesize = (1 << priv->pagewidth);
- }
+ priv->pagesize = data->pagesize;
if (dev_read_u32(dev, "size", &size) == 0)
priv->size = size;
if (dev_read_u32(dev, "size", &size) == 0)
priv->size = size;
@@
-140,9
+142,18
@@
static int i2c_eeprom_std_probe(struct udevice *dev)
{
u8 test_byte;
int ret;
{
u8 test_byte;
int ret;
+ struct i2c_eeprom_drv_data *data =
+ (struct i2c_eeprom_drv_data *)dev_get_driver_data(dev);
+
+ i2c_set_chip_offset_len(dev, data->offset_len);
+ i2c_set_chip_addr_offset_mask(dev, data->addr_offset_mask);
/* Verify that the chip is functional */
/* Verify that the chip is functional */
- ret = i2c_eeprom_read(dev, 0, &test_byte, 1);
+ /*
+ * Not all eeproms start from offset 0. Valid offset is available
+ * in the platform data struct.
+ */
+ ret = i2c_eeprom_read(dev, data->start_offset, &test_byte, 1);
if (ret)
return -ENODEV;
if (ret)
return -ENODEV;
@@
-151,72
+162,101
@@
static int i2c_eeprom_std_probe(struct udevice *dev)
static const struct i2c_eeprom_drv_data eeprom_data = {
.size = 0,
static const struct i2c_eeprom_drv_data eeprom_data = {
.size = 0,
- .pagewidth = 0,
+ .pagesize = 1,
+ .addr_offset_mask = 0,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data mc24aa02e48_data = {
.size = 256,
};
static const struct i2c_eeprom_drv_data mc24aa02e48_data = {
.size = 256,
- .pagewidth = 3,
+ .pagesize = 8,
+ .addr_offset_mask = 0,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24c01a_data = {
.size = 128,
};
static const struct i2c_eeprom_drv_data atmel24c01a_data = {
.size = 128,
- .pagewidth = 3,
+ .pagesize = 8,
+ .addr_offset_mask = 0,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24c02_data = {
.size = 256,
};
static const struct i2c_eeprom_drv_data atmel24c02_data = {
.size = 256,
- .pagewidth = 3,
+ .pagesize = 8,
+ .addr_offset_mask = 0,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24c04_data = {
.size = 512,
};
static const struct i2c_eeprom_drv_data atmel24c04_data = {
.size = 512,
- .pagewidth = 4,
+ .pagesize = 16,
+ .addr_offset_mask = 0x1,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24c08_data = {
.size = 1024,
};
static const struct i2c_eeprom_drv_data atmel24c08_data = {
.size = 1024,
- .pagewidth = 4,
+ .pagesize = 16,
+ .addr_offset_mask = 0x3,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24c08a_data = {
.size = 1024,
};
static const struct i2c_eeprom_drv_data atmel24c08a_data = {
.size = 1024,
- .pagewidth = 4,
+ .pagesize = 16,
+ .addr_offset_mask = 0x3,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24c16a_data = {
.size = 2048,
};
static const struct i2c_eeprom_drv_data atmel24c16a_data = {
.size = 2048,
- .pagewidth = 4,
+ .pagesize = 16,
+ .addr_offset_mask = 0x7,
+ .offset_len = 1,
};
static const struct i2c_eeprom_drv_data atmel24mac402_data = {
.size = 256,
};
static const struct i2c_eeprom_drv_data atmel24mac402_data = {
.size = 256,
- .pagewidth = 4,
+ .pagesize = 16,
+ .addr_offset_mask = 0,
+ .offset_len = 1,
+ .start_offset = 0x80,
};
static const struct i2c_eeprom_drv_data atmel24c32_data = {
.size = 4096,
};
static const struct i2c_eeprom_drv_data atmel24c32_data = {
.size = 4096,
- .pagewidth = 5,
+ .pagesize = 32,
+ .addr_offset_mask = 0,
+ .offset_len = 2,
};
static const struct i2c_eeprom_drv_data atmel24c64_data = {
.size = 8192,
};
static const struct i2c_eeprom_drv_data atmel24c64_data = {
.size = 8192,
- .pagewidth = 5,
+ .pagesize = 32,
+ .addr_offset_mask = 0,
+ .offset_len = 2,
};
static const struct i2c_eeprom_drv_data atmel24c128_data = {
.size = 16384,
};
static const struct i2c_eeprom_drv_data atmel24c128_data = {
.size = 16384,
- .pagewidth = 6,
+ .pagesize = 64,
+ .addr_offset_mask = 0,
+ .offset_len = 2,
};
static const struct i2c_eeprom_drv_data atmel24c256_data = {
.size = 32768,
};
static const struct i2c_eeprom_drv_data atmel24c256_data = {
.size = 32768,
- .pagewidth = 6,
+ .pagesize = 64,
+ .addr_offset_mask = 0,
+ .offset_len = 2,
};
static const struct i2c_eeprom_drv_data atmel24c512_data = {
.size = 65536,
};
static const struct i2c_eeprom_drv_data atmel24c512_data = {
.size = 65536,
- .pagewidth = 6,
+ .pagesize = 64,
+ .addr_offset_mask = 0,
+ .offset_len = 2,
};
static const struct udevice_id i2c_eeprom_std_ids[] = {
};
static const struct udevice_id i2c_eeprom_std_ids[] = {
@@
-261,19
+301,20
@@
static int i2c_eeprom_partition_probe(struct udevice *dev)
static int i2c_eeprom_partition_ofdata_to_platdata(struct udevice *dev)
{
struct i2c_eeprom_partition *priv = dev_get_priv(dev);
static int i2c_eeprom_partition_ofdata_to_platdata(struct udevice *dev)
{
struct i2c_eeprom_partition *priv = dev_get_priv(dev);
- u32
offset, size
;
+ u32
reg[2]
;
int ret;
int ret;
- ret = dev_read_u32
(dev, "offset", &offset
);
+ ret = dev_read_u32
_array(dev, "reg", reg, 2
);
if (ret)
return ret;
if (ret)
return ret;
- ret = dev_read_u32(dev, "size", &size);
- if (ret)
- return ret;
+ if (!reg[1])
+ return -EINVAL;
+
+ priv->offset = reg[0];
+ priv->size = reg[1];
- priv->offset = offset;
- priv->size = size;
+ debug("%s: base %x, size %x\n", __func__, priv->offset, priv->size);
return 0;
}
return 0;
}