int i2c_get_chip_for_busnum(int busnum, int chip_addr, uint offset_len, struct udevice **devp) { struct udevice *bus; int ret; ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus); if (ret) { debug("Cannot find I2C bus %d\n", busnum); return ret; } /* detect the presence of the chip on the bus */ ret = i2c_probe_chip(bus, chip_addr, 0); debug("%s: bus='%s', address %02x, ret=%d\n", __func__, bus->name, chip_addr, ret); if (ret) { debug("Cannot detect I2C chip %02x on bus %d\n", chip_addr, busnum); return ret; } ret = i2c_get_chip(bus, chip_addr, offset_len, devp); if (ret) { debug("Cannot find I2C chip %02x on bus %d\n", chip_addr, busnum); return ret; } return 0; }
static bool disable_mcu_watchdog(void) { struct udevice *bus, *dev; int ret, retry = 3; uchar buf[1] = {0x0}; if (uclass_get_device_by_name(UCLASS_I2C, OMNIA_I2C_MCU_DM_NAME, &bus)) { puts("Cannot find MCU bus! Can not disable MCU WDT.\n"); return false; } ret = i2c_get_chip(bus, OMNIA_I2C_MCU, 1, &dev); if (ret) { puts("Cannot get MCU chip! Can not disable MCU WDT.\n"); return false; } for (; retry > 0; --retry) if (!dm_i2c_write(dev, OMNIA_I2C_MCU_WDT_ADDR, (uchar *) buf, 1)) break; if (retry <= 0) { puts("I2C MCU watchdog failed to disable!\n"); return false; } return true; }
/** * ti_i2c_set_alen - Set chip's i2c address length * @bus_addr - I2C bus number * @dev_addr - I2C eeprom id * @alen - I2C address length in bytes * * DM_I2C by default sets the address length to be used to 1. This * function allows this address length to be changed to match the * eeprom used for board detection. */ int __maybe_unused ti_i2c_set_alen(int bus_addr, int dev_addr, int alen) { struct udevice *dev; struct udevice *bus; int rc; rc = uclass_get_device_by_seq(UCLASS_I2C, bus_addr, &bus); if (rc) return rc; rc = i2c_get_chip(bus, dev_addr, 1, &dev); if (rc) return rc; rc = i2c_set_chip_offset_len(dev, alen); if (rc) return rc; return 0; }
int i2c_get_chip_for_busnum(int busnum, int chip_addr, struct udevice **devp) { struct udevice *bus; int ret; ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus); if (ret) { debug("Cannot find I2C bus %d\n", busnum); return ret; } ret = i2c_get_chip(bus, chip_addr, devp); if (ret) { debug("Cannot find I2C chip %02x on bus %d\n", chip_addr, busnum); return ret; } return 0; }
static bool omnia_detect_sata(void) { struct udevice *bus, *dev; int ret, retry = 3; u16 mode; puts("SERDES0 card detect: "); if (uclass_get_device_by_name(UCLASS_I2C, OMNIA_I2C_MCU_DM_NAME, &bus)) { puts("Cannot find MCU bus!\n"); return false; } ret = i2c_get_chip(bus, OMNIA_I2C_MCU, 1, &dev); if (ret) { puts("Cannot get MCU chip!\n"); return false; } for (; retry > 0; --retry) { ret = dm_i2c_read(dev, OMNIA_I2C_MCU_ADDR_STATUS, (uchar *) &mode, 2); if (!ret) break; } if (!retry) { puts("I2C read failed! Default PEX\n"); return false; } if (!(mode & OMNIA_I2C_MCU_CARDDET)) { puts("NONE\n"); return false; } if (mode & OMNIA_I2C_MCU_SATA) { puts("SATA\n"); return true; } else { puts("PEX\n"); return false; } }
static bool omnia_read_eeprom(struct omnia_eeprom *oep) { struct udevice *bus, *dev; int ret, crc, retry = 3; if (uclass_get_device_by_name(UCLASS_I2C, OMNIA_I2C_EEPROM_DM_NAME, &bus)) { puts("Cannot find EEPROM bus\n"); return false; } ret = i2c_get_chip(bus, OMNIA_I2C_EEPROM, OMNIA_I2C_EEPROM_ADDRLEN, &dev); if (ret) { puts("Cannot get EEPROM chip\n"); return false; } for (; retry > 0; --retry) { ret = dm_i2c_read(dev, OMNIA_I2C_EEPROM_CONFIG_ADDR, (uchar *) oep, sizeof(struct omnia_eeprom)); if (ret) continue; if (oep->magic != OMNIA_I2C_EEPROM_MAGIC) { puts("I2C EEPROM missing magic number!\n"); continue; } crc = crc32(0, (unsigned char *) oep, sizeof(struct omnia_eeprom) - 4); if (crc == oep->crc) { break; } else { printf("CRC of EEPROM memory config failed! " "calc=0x%04x saved=0x%04x\n", crc, oep->crc); } } if (!retry) { puts("I2C EEPROM read failed!\n"); return false; } return true; }
int dm_i2c_probe(struct udevice *bus, uint chip_addr, uint chip_flags, struct udevice **devp) { int ret; *devp = NULL; /* First probe that chip */ ret = i2c_probe_chip(bus, chip_addr, chip_flags); debug("%s: bus='%s', address %02x, ret=%d\n", __func__, bus->name, chip_addr, ret); if (ret) return ret; /* The chip was found, see if we have a driver, and probe it */ ret = i2c_get_chip(bus, chip_addr, 1, devp); debug("%s: i2c_get_chip: ret=%d\n", __func__, ret); return ret; }
int pmu_set_nominal(void) { struct udevice *bus, *dev; int core, cpu; int ret; /* by default, the table has been filled with T25 settings */ switch (tegra_get_chip_sku()) { case TEGRA_SOC_T20: core = VDD_CORE_NOMINAL_T20; cpu = VDD_CPU_NOMINAL_T20; break; case TEGRA_SOC_T25: core = VDD_CORE_NOMINAL_T25; cpu = VDD_CPU_NOMINAL_T25; break; default: debug("%s: Unknown SKU id\n", __func__); return -1; } ret = tegra_i2c_get_dvc_bus(&bus); if (ret) { debug("%s: Cannot find DVC I2C bus\n", __func__); return ret; } ret = i2c_get_chip(bus, PMI_I2C_ADDRESS, &dev); if (ret) { debug("%s: Cannot find DVC I2C chip\n", __func__); return ret; } tps6586x_init(dev); tps6586x_set_pwm_mode(TPS6586X_PWM_SM1); return tps6586x_adjust_sm0_sm1(core, cpu, VDD_TRANSITION_STEP, VDD_TRANSITION_RATE, VDD_RELATION); }