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