xref: /rk3399_rockchip-uboot/drivers/i2c/i2c-uclass-compat.c (revision 73845350b6281a7afeeb279475e6eb613d7a89f9)
1*73845350SSimon Glass /*
2*73845350SSimon Glass  * Copyright (c) 2014 Google, Inc
3*73845350SSimon Glass  *
4*73845350SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
5*73845350SSimon Glass  */
6*73845350SSimon Glass 
7*73845350SSimon Glass #include <common.h>
8*73845350SSimon Glass #include <dm.h>
9*73845350SSimon Glass #include <errno.h>
10*73845350SSimon Glass #include <i2c.h>
11*73845350SSimon Glass 
12*73845350SSimon Glass static int cur_busnum;
13*73845350SSimon Glass 
14*73845350SSimon Glass static int i2c_compat_get_device(uint chip_addr, int alen,
15*73845350SSimon Glass 				 struct udevice **devp)
16*73845350SSimon Glass {
17*73845350SSimon Glass 	struct dm_i2c_chip *chip;
18*73845350SSimon Glass 	int ret;
19*73845350SSimon Glass 
20*73845350SSimon Glass 	ret = i2c_get_chip_for_busnum(cur_busnum, chip_addr, devp);
21*73845350SSimon Glass 	if (ret)
22*73845350SSimon Glass 		return ret;
23*73845350SSimon Glass 	chip = dev_get_parentdata(*devp);
24*73845350SSimon Glass 	if (chip->offset_len != alen) {
25*73845350SSimon Glass 		printf("Requested alen %d does not match chip offset_len %d\n",
26*73845350SSimon Glass 		       alen, chip->offset_len);
27*73845350SSimon Glass 		return -EADDRNOTAVAIL;
28*73845350SSimon Glass 	}
29*73845350SSimon Glass 
30*73845350SSimon Glass 	return 0;
31*73845350SSimon Glass }
32*73845350SSimon Glass 
33*73845350SSimon Glass int i2c_probe(uint8_t chip_addr)
34*73845350SSimon Glass {
35*73845350SSimon Glass 	struct udevice *bus, *dev;
36*73845350SSimon Glass 	int ret;
37*73845350SSimon Glass 
38*73845350SSimon Glass 	ret = uclass_get_device_by_seq(UCLASS_I2C, cur_busnum, &bus);
39*73845350SSimon Glass 	if (ret) {
40*73845350SSimon Glass 		debug("Cannot find I2C bus %d: err=%d\n", cur_busnum, ret);
41*73845350SSimon Glass 		return ret;
42*73845350SSimon Glass 	}
43*73845350SSimon Glass 
44*73845350SSimon Glass 	if (!bus)
45*73845350SSimon Glass 		return -ENOENT;
46*73845350SSimon Glass 
47*73845350SSimon Glass 	return dm_i2c_probe(bus, chip_addr, 0, &dev);
48*73845350SSimon Glass }
49*73845350SSimon Glass 
50*73845350SSimon Glass int i2c_read(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
51*73845350SSimon Glass 	     int len)
52*73845350SSimon Glass {
53*73845350SSimon Glass 	struct udevice *dev;
54*73845350SSimon Glass 	int ret;
55*73845350SSimon Glass 
56*73845350SSimon Glass 	ret = i2c_compat_get_device(chip_addr, alen, &dev);
57*73845350SSimon Glass 	if (ret)
58*73845350SSimon Glass 		return ret;
59*73845350SSimon Glass 
60*73845350SSimon Glass 	return dm_i2c_read(dev, addr, buffer, len);
61*73845350SSimon Glass }
62*73845350SSimon Glass 
63*73845350SSimon Glass int i2c_write(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
64*73845350SSimon Glass 	      int len)
65*73845350SSimon Glass {
66*73845350SSimon Glass 	struct udevice *dev;
67*73845350SSimon Glass 	int ret;
68*73845350SSimon Glass 
69*73845350SSimon Glass 	ret = i2c_compat_get_device(chip_addr, alen, &dev);
70*73845350SSimon Glass 	if (ret)
71*73845350SSimon Glass 		return ret;
72*73845350SSimon Glass 
73*73845350SSimon Glass 	return dm_i2c_write(dev, addr, buffer, len);
74*73845350SSimon Glass }
75*73845350SSimon Glass 
76*73845350SSimon Glass int i2c_get_bus_num_fdt(int node)
77*73845350SSimon Glass {
78*73845350SSimon Glass 	struct udevice *bus;
79*73845350SSimon Glass 	int ret;
80*73845350SSimon Glass 
81*73845350SSimon Glass 	ret = uclass_get_device_by_of_offset(UCLASS_I2C, node, &bus);
82*73845350SSimon Glass 	if (ret)
83*73845350SSimon Glass 		return ret;
84*73845350SSimon Glass 
85*73845350SSimon Glass 	return bus->seq;
86*73845350SSimon Glass }
87*73845350SSimon Glass 
88*73845350SSimon Glass unsigned int i2c_get_bus_num(void)
89*73845350SSimon Glass {
90*73845350SSimon Glass 	return cur_busnum;
91*73845350SSimon Glass }
92*73845350SSimon Glass 
93*73845350SSimon Glass int i2c_set_bus_num(unsigned int bus)
94*73845350SSimon Glass {
95*73845350SSimon Glass 	cur_busnum = bus;
96*73845350SSimon Glass 
97*73845350SSimon Glass 	return 0;
98*73845350SSimon Glass }
99