xref: /rk3399_rockchip-uboot/drivers/i2c/i2c-uclass-compat.c (revision 95def3cf5d24aebbcdffe6c4fc1a39288cf00b6a)
173845350SSimon Glass /*
273845350SSimon Glass  * Copyright (c) 2014 Google, Inc
373845350SSimon Glass  *
473845350SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
573845350SSimon Glass  */
673845350SSimon Glass 
773845350SSimon Glass #include <common.h>
873845350SSimon Glass #include <dm.h>
973845350SSimon Glass #include <errno.h>
1073845350SSimon Glass #include <i2c.h>
1173845350SSimon Glass 
12*95def3cfSVignesh R static int cur_busnum __attribute__((section(".data")));
1373845350SSimon Glass 
i2c_compat_get_device(uint chip_addr,int alen,struct udevice ** devp)1473845350SSimon Glass static int i2c_compat_get_device(uint chip_addr, int alen,
1573845350SSimon Glass 				 struct udevice **devp)
1673845350SSimon Glass {
1773845350SSimon Glass 	struct dm_i2c_chip *chip;
1873845350SSimon Glass 	int ret;
1973845350SSimon Glass 
2018a7f6aaSPrzemyslaw Marczak 	ret = i2c_get_chip_for_busnum(cur_busnum, chip_addr, alen, devp);
2173845350SSimon Glass 	if (ret)
2273845350SSimon Glass 		return ret;
23e6f66ec0SSimon Glass 	chip = dev_get_parent_platdata(*devp);
2473845350SSimon Glass 	if (chip->offset_len != alen) {
25d744d561SSimon Glass 		printf("I2C chip %x: requested alen %d does not match chip offset_len %d\n",
26d744d561SSimon Glass 		       chip_addr, alen, chip->offset_len);
2773845350SSimon Glass 		return -EADDRNOTAVAIL;
2873845350SSimon Glass 	}
2973845350SSimon Glass 
3073845350SSimon Glass 	return 0;
3173845350SSimon Glass }
3273845350SSimon Glass 
i2c_probe(uint8_t chip_addr)3373845350SSimon Glass int i2c_probe(uint8_t chip_addr)
3473845350SSimon Glass {
3573845350SSimon Glass 	struct udevice *bus, *dev;
3673845350SSimon Glass 	int ret;
3773845350SSimon Glass 
3873845350SSimon Glass 	ret = uclass_get_device_by_seq(UCLASS_I2C, cur_busnum, &bus);
3973845350SSimon Glass 	if (ret) {
4073845350SSimon Glass 		debug("Cannot find I2C bus %d: err=%d\n", cur_busnum, ret);
4173845350SSimon Glass 		return ret;
4273845350SSimon Glass 	}
4373845350SSimon Glass 
4473845350SSimon Glass 	if (!bus)
4573845350SSimon Glass 		return -ENOENT;
4673845350SSimon Glass 
4773845350SSimon Glass 	return dm_i2c_probe(bus, chip_addr, 0, &dev);
4873845350SSimon Glass }
4973845350SSimon Glass 
i2c_read(uint8_t chip_addr,unsigned int addr,int alen,uint8_t * buffer,int len)5073845350SSimon Glass int i2c_read(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
5173845350SSimon Glass 	     int len)
5273845350SSimon Glass {
5373845350SSimon Glass 	struct udevice *dev;
5473845350SSimon Glass 	int ret;
5573845350SSimon Glass 
5673845350SSimon Glass 	ret = i2c_compat_get_device(chip_addr, alen, &dev);
5773845350SSimon Glass 	if (ret)
5873845350SSimon Glass 		return ret;
5973845350SSimon Glass 
6073845350SSimon Glass 	return dm_i2c_read(dev, addr, buffer, len);
6173845350SSimon Glass }
6273845350SSimon Glass 
i2c_write(uint8_t chip_addr,unsigned int addr,int alen,uint8_t * buffer,int len)6373845350SSimon Glass int i2c_write(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
6473845350SSimon Glass 	      int len)
6573845350SSimon Glass {
6673845350SSimon Glass 	struct udevice *dev;
6773845350SSimon Glass 	int ret;
6873845350SSimon Glass 
6973845350SSimon Glass 	ret = i2c_compat_get_device(chip_addr, alen, &dev);
7073845350SSimon Glass 	if (ret)
7173845350SSimon Glass 		return ret;
7273845350SSimon Glass 
7373845350SSimon Glass 	return dm_i2c_write(dev, addr, buffer, len);
7473845350SSimon Glass }
7573845350SSimon Glass 
i2c_get_bus_num_fdt(int node)7673845350SSimon Glass int i2c_get_bus_num_fdt(int node)
7773845350SSimon Glass {
7873845350SSimon Glass 	struct udevice *bus;
7973845350SSimon Glass 	int ret;
8073845350SSimon Glass 
8173845350SSimon Glass 	ret = uclass_get_device_by_of_offset(UCLASS_I2C, node, &bus);
8273845350SSimon Glass 	if (ret)
8373845350SSimon Glass 		return ret;
8473845350SSimon Glass 
8573845350SSimon Glass 	return bus->seq;
8673845350SSimon Glass }
8773845350SSimon Glass 
i2c_get_bus_num(void)8873845350SSimon Glass unsigned int i2c_get_bus_num(void)
8973845350SSimon Glass {
9073845350SSimon Glass 	return cur_busnum;
9173845350SSimon Glass }
9273845350SSimon Glass 
i2c_set_bus_num(unsigned int bus)9373845350SSimon Glass int i2c_set_bus_num(unsigned int bus)
9473845350SSimon Glass {
9573845350SSimon Glass 	cur_busnum = bus;
9673845350SSimon Glass 
9773845350SSimon Glass 	return 0;
9873845350SSimon Glass }
99d744d561SSimon Glass 
i2c_init(int speed,int slaveaddr)100d744d561SSimon Glass void i2c_init(int speed, int slaveaddr)
101d744d561SSimon Glass {
102d744d561SSimon Glass 	/* Nothing to do here - the init happens through driver model */
103d744d561SSimon Glass }
104d744d561SSimon Glass 
board_i2c_init(const void * blob)105d744d561SSimon Glass void board_i2c_init(const void *blob)
106d744d561SSimon Glass {
107d744d561SSimon Glass 	/* Nothing to do here - the init happens through driver model */
108d744d561SSimon Glass }
109a2879764SSimon Glass 
i2c_reg_read(uint8_t chip_addr,uint8_t offset)110a2879764SSimon Glass uint8_t i2c_reg_read(uint8_t chip_addr, uint8_t offset)
111a2879764SSimon Glass {
112a2879764SSimon Glass 	struct udevice *dev;
113a2879764SSimon Glass 	int ret;
114a2879764SSimon Glass 
115a2879764SSimon Glass 	ret = i2c_compat_get_device(chip_addr, 1, &dev);
116a2879764SSimon Glass 	if (ret)
117a2879764SSimon Glass 		return 0xff;
118a2879764SSimon Glass 	return dm_i2c_reg_read(dev, offset);
119a2879764SSimon Glass }
120a2879764SSimon Glass 
i2c_reg_write(uint8_t chip_addr,uint8_t offset,uint8_t val)121a2879764SSimon Glass void i2c_reg_write(uint8_t chip_addr, uint8_t offset, uint8_t val)
122a2879764SSimon Glass {
123a2879764SSimon Glass 	struct udevice *dev;
124a2879764SSimon Glass 	int ret;
125a2879764SSimon Glass 
126a2879764SSimon Glass 	ret = i2c_compat_get_device(chip_addr, 1, &dev);
127a2879764SSimon Glass 	if (!ret)
128a2879764SSimon Glass 		dm_i2c_reg_write(dev, offset, val);
129a2879764SSimon Glass }
130