xref: /openbmc/u-boot/drivers/misc/i2c_eeprom.c (revision 5e75ea15)
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 
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 
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 
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