/* * Copyright (c) 2014 Google, Inc * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include static int cur_busnum; static int i2c_compat_get_device(uint chip_addr, int alen, struct udevice **devp) { struct dm_i2c_chip *chip; int ret; ret = i2c_get_chip_for_busnum(cur_busnum, chip_addr, alen, devp); if (ret) return ret; chip = dev_get_parent_platdata(*devp); if (chip->offset_len != alen) { printf("I2C chip %x: requested alen %d does not match chip offset_len %d\n", chip_addr, alen, chip->offset_len); return -EADDRNOTAVAIL; } return 0; } int i2c_probe(uint8_t chip_addr) { struct udevice *bus, *dev; int ret; ret = uclass_get_device_by_seq(UCLASS_I2C, cur_busnum, &bus); if (ret) { debug("Cannot find I2C bus %d: err=%d\n", cur_busnum, ret); return ret; } if (!bus) return -ENOENT; return dm_i2c_probe(bus, chip_addr, 0, &dev); } int i2c_read(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer, int len) { struct udevice *dev; int ret; ret = i2c_compat_get_device(chip_addr, alen, &dev); if (ret) return ret; return dm_i2c_read(dev, addr, buffer, len); } int i2c_write(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer, int len) { struct udevice *dev; int ret; ret = i2c_compat_get_device(chip_addr, alen, &dev); if (ret) return ret; return dm_i2c_write(dev, addr, buffer, len); } int i2c_get_bus_num_fdt(int node) { struct udevice *bus; int ret; ret = uclass_get_device_by_of_offset(UCLASS_I2C, node, &bus); if (ret) return ret; return bus->seq; } unsigned int i2c_get_bus_num(void) { return cur_busnum; } int i2c_set_bus_num(unsigned int bus) { cur_busnum = bus; return 0; } void i2c_init(int speed, int slaveaddr) { /* Nothing to do here - the init happens through driver model */ } void board_i2c_init(const void *blob) { /* Nothing to do here - the init happens through driver model */ } uint8_t i2c_reg_read(uint8_t chip_addr, uint8_t offset) { struct udevice *dev; int ret; ret = i2c_compat_get_device(chip_addr, 1, &dev); if (ret) return 0xff; return dm_i2c_reg_read(dev, offset); } void i2c_reg_write(uint8_t chip_addr, uint8_t offset, uint8_t val) { struct udevice *dev; int ret; ret = i2c_compat_get_device(chip_addr, 1, &dev); if (!ret) dm_i2c_reg_write(dev, offset, val); }