/** * Switch power at an external regulator (for our root hub). * * @param ctrl pointer to the xHCI controller * @param port port number as in the control message (one-based) * @param enable boolean indicating whether to enable or disable power * @return returns 0 on success, an error-code on failure */ static int board_usb_port_power_set(struct udevice *dev, int port, bool enable) { #if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(DM_REGULATOR) /* We start counting ports at 0, while USB counts from 1. */ int index = port - 1; const char *regname = NULL; struct udevice *regulator; const char *prop = "tsd,usb-port-power"; int ret; debug("%s: ctrl '%s' port %d enable %s\n", __func__, dev_read_name(dev), port, enable ? "true" : "false"); ret = dev_read_string_index(dev, prop, index, ®name); if (ret < 0) { debug("%s: ctrl '%s' port %d: no entry in '%s'\n", __func__, dev_read_name(dev), port, prop); return ret; } ret = regulator_get_by_platname(regname, ®ulator); if (ret) { debug("%s: ctrl '%s' port %d: could not get regulator '%s'\n", __func__, dev_read_name(dev), port, regname); return ret; } regulator_set_enable(regulator, enable); return 0; #else return -ENOTSUPP; #endif }
static int i2c_deblock_gpio(struct udevice *bus) { struct gpio_desc gpios[PIN_COUNT]; int ret, ret0; ret = gpio_request_list_by_name(bus, "gpios", gpios, ARRAY_SIZE(gpios), GPIOD_IS_IN); if (ret != ARRAY_SIZE(gpios)) { debug("%s: I2C Node '%s' has no 'gpios' property %s\n", __func__, dev_read_name(bus), bus->name); if (ret >= 0) { gpio_free_list(bus, gpios, ret); ret = -ENOENT; } goto out; } ret = pinctrl_select_state(bus, "gpio"); if (ret) { debug("%s: I2C Node '%s' has no 'gpio' pinctrl state. %s\n", __func__, dev_read_name(bus), bus->name); goto out_no_pinctrl; } ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL]); ret = pinctrl_select_state(bus, "default"); if (ret) { debug("%s: I2C Node '%s' has no 'default' pinctrl state. %s\n", __func__, dev_read_name(bus), bus->name); } ret = !ret ? ret0 : ret; out_no_pinctrl: gpio_free_list(bus, gpios, ARRAY_SIZE(gpios)); out: return ret; }
int i2c_chip_ofdata_to_platdata(struct udevice *dev, struct dm_i2c_chip *chip) { int addr; chip->offset_len = dev_read_u32_default(dev, "u-boot,i2c-offset-len", 1); chip->flags = 0; addr = dev_read_u32_default(dev, "reg", -1); if (addr == -1) { debug("%s: I2C Node '%s' has no 'reg' property %s\n", __func__, dev_read_name(dev), dev->name); return -EINVAL; } chip->chip_addr = addr; return 0; }