Home | History | Annotate | Download | only in i2c
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Copyright (c) 2014 Google, Inc
      4  */
      5 
      6 #include <common.h>
      7 #include <dm.h>
      8 #include <errno.h>
      9 #include <i2c.h>
     10 
     11 static int cur_busnum __attribute__((section(".data")));
     12 
     13 static int i2c_compat_get_device(uint chip_addr, int alen,
     14 				 struct udevice **devp)
     15 {
     16 	struct dm_i2c_chip *chip;
     17 	int ret;
     18 
     19 	ret = i2c_get_chip_for_busnum(cur_busnum, chip_addr, alen, devp);
     20 	if (ret)
     21 		return ret;
     22 	chip = dev_get_parent_platdata(*devp);
     23 	if (chip->offset_len != alen) {
     24 		printf("I2C chip %x: requested alen %d does not match chip offset_len %d\n",
     25 		       chip_addr, alen, chip->offset_len);
     26 		return -EADDRNOTAVAIL;
     27 	}
     28 
     29 	return 0;
     30 }
     31 
     32 int i2c_probe(uint8_t chip_addr)
     33 {
     34 	struct udevice *bus, *dev;
     35 	int ret;
     36 
     37 	ret = uclass_get_device_by_seq(UCLASS_I2C, cur_busnum, &bus);
     38 	if (ret) {
     39 		debug("Cannot find I2C bus %d: err=%d\n", cur_busnum, ret);
     40 		return ret;
     41 	}
     42 
     43 	if (!bus)
     44 		return -ENOENT;
     45 
     46 	return dm_i2c_probe(bus, chip_addr, 0, &dev);
     47 }
     48 
     49 int i2c_read(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
     50 	     int len)
     51 {
     52 	struct udevice *dev;
     53 	int ret;
     54 
     55 	ret = i2c_compat_get_device(chip_addr, alen, &dev);
     56 	if (ret)
     57 		return ret;
     58 
     59 	return dm_i2c_read(dev, addr, buffer, len);
     60 }
     61 
     62 int i2c_write(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
     63 	      int len)
     64 {
     65 	struct udevice *dev;
     66 	int ret;
     67 
     68 	ret = i2c_compat_get_device(chip_addr, alen, &dev);
     69 	if (ret)
     70 		return ret;
     71 
     72 	return dm_i2c_write(dev, addr, buffer, len);
     73 }
     74 
     75 int i2c_get_bus_num_fdt(int node)
     76 {
     77 	struct udevice *bus;
     78 	int ret;
     79 
     80 	ret = uclass_get_device_by_of_offset(UCLASS_I2C, node, &bus);
     81 	if (ret)
     82 		return ret;
     83 
     84 	return bus->seq;
     85 }
     86 
     87 unsigned int i2c_get_bus_num(void)
     88 {
     89 	return cur_busnum;
     90 }
     91 
     92 int i2c_set_bus_num(unsigned int bus)
     93 {
     94 	cur_busnum = bus;
     95 
     96 	return 0;
     97 }
     98 
     99 void i2c_init(int speed, int slaveaddr)
    100 {
    101 	/* Nothing to do here - the init happens through driver model */
    102 }
    103 
    104 void board_i2c_init(const void *blob)
    105 {
    106 	/* Nothing to do here - the init happens through driver model */
    107 }
    108 
    109 uint8_t i2c_reg_read(uint8_t chip_addr, uint8_t offset)
    110 {
    111 	struct udevice *dev;
    112 	int ret;
    113 
    114 	ret = i2c_compat_get_device(chip_addr, 1, &dev);
    115 	if (ret)
    116 		return 0xff;
    117 	return dm_i2c_reg_read(dev, offset);
    118 }
    119 
    120 void i2c_reg_write(uint8_t chip_addr, uint8_t offset, uint8_t val)
    121 {
    122 	struct udevice *dev;
    123 	int ret;
    124 
    125 	ret = i2c_compat_get_device(chip_addr, 1, &dev);
    126 	if (!ret)
    127 		dm_i2c_reg_write(dev, offset, val);
    128 }
    129