int gpio_claim_vector(const int *gpio_num_array, const char *fmt) { int i, ret; int gpio; for (i = 0; i < 32; i++) { gpio = gpio_num_array[i]; if (gpio == -1) break; ret = gpio_requestf(gpio, fmt, i); if (ret) goto err; ret = gpio_direction_input(gpio); if (ret) { gpio_free(gpio); goto err; } } return 0; err: for (i--; i >= 0; i--) gpio_free(gpio_num_array[i]); return ret; }
static int copy_spd(struct pei_data *peid) { const int gpio_vector[] = {41, 42, 43, 10, -1}; int spd_index; const void *blob = gd->fdt_blob; int node, spd_node; int ret, i; for (i = 0; ; i++) { if (gpio_vector[i] == -1) break; ret = gpio_requestf(gpio_vector[i], "spd_id%d", i); if (ret) { debug("%s: Could not request gpio %d\n", __func__, gpio_vector[i]); return ret; } } spd_index = gpio_get_values_as_int(gpio_vector); debug("spd index %d\n", spd_index); node = fdtdec_next_compatible(blob, 0, COMPAT_MEMORY_SPD); if (node < 0) { printf("SPD data not found.\n"); return -ENOENT; } for (spd_node = fdt_first_subnode(blob, node); spd_node > 0; spd_node = fdt_next_subnode(blob, spd_node)) { const char *data; int len; if (fdtdec_get_int(blob, spd_node, "reg", -1) != spd_index) continue; data = fdt_getprop(blob, spd_node, "data", &len); if (len < sizeof(peid->spd_data[0])) { printf("Missing SPD data\n"); return -EINVAL; } debug("Using SDRAM SPD data for '%s'\n", fdt_get_name(blob, spd_node, NULL)); memcpy(peid->spd_data[0], data, sizeof(peid->spd_data[0])); break; } if (spd_node < 0) { printf("No SPD data found for index %d\n", spd_index); return -ENOENT; } return 0; }
/* Test that gpio_requestf() works as expected */ static int dm_test_gpio_requestf(struct dm_test_state *dms) { unsigned int offset, gpio; struct udevice *dev; char buf[80]; ut_assertok(gpio_lookup_name("b5", &dev, &offset, &gpio)); ut_assertok(gpio_requestf(gpio, "testing %d %s", 1, "hi")); sandbox_gpio_set_direction(dev, offset, 1); sandbox_gpio_set_value(dev, offset, 1); ut_assertok(gpio_get_status(dev, offset, buf, sizeof(buf))); ut_asserteq_str("b5: output: 1 [x] testing 1 hi", buf); return 0; }
/* setup GPIO pinmux and default configuration per baseboard and env */ void setup_board_gpio(int board, struct ventana_board_info *info) { const char *s; char arg[10]; size_t len; int i; int quiet = simple_strtol(getenv("quiet"), NULL, 10); if (board >= GW_UNKNOWN) return; /* RS232_EN# */ if (gpio_cfg[board].rs232_en) { gpio_direction_output(gpio_cfg[board].rs232_en, (hwconfig("rs232")) ? 0 : 1); } /* MSATA Enable */ if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) { gpio_direction_output(GP_MSATA_SEL, (hwconfig("msata")) ? 1 : 0); } /* USBOTG Select (PCISKT or FrontPanel) */ if (gpio_cfg[board].usb_sel) { gpio_direction_output(gpio_cfg[board].usb_sel, (hwconfig("usb_pcisel")) ? 1 : 0); } /* * Configure DIO pinmux/padctl registers * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions */ for (i = 0; i < gpio_cfg[board].dio_num; i++) { struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i]; iomux_v3_cfg_t ctrl = DIO_PAD_CFG; unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1; if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1]) continue; sprintf(arg, "dio%d", i); if (!hwconfig(arg)) continue; s = hwconfig_subarg(arg, "padctrl", &len); if (s) { ctrl = MUX_PAD_CTRL(simple_strtoul(s, NULL, 16) & 0x1ffff) | MUX_MODE_SION; } if (hwconfig_subarg_cmp(arg, "mode", "gpio")) { if (!quiet) { printf("DIO%d: GPIO%d_IO%02d (gpio-%d)\n", i, (cfg->gpio_param/32)+1, cfg->gpio_param%32, cfg->gpio_param); } imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] | ctrl); gpio_requestf(cfg->gpio_param, "dio%d", i); gpio_direction_input(cfg->gpio_param); } else if (hwconfig_subarg_cmp(arg, "mode", "pwm") && cfg->pwm_padmux) { if (!cfg->pwm_param) { printf("DIO%d: Error: pwm config invalid\n", i); continue; } if (!quiet) printf("DIO%d: pwm%d\n", i, cfg->pwm_param); imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] | MUX_PAD_CTRL(ctrl)); } } if (!quiet) { if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) { printf("MSATA: %s\n", (hwconfig("msata") ? "enabled" : "disabled")); } if (gpio_cfg[board].rs232_en) { printf("RS232: %s\n", (hwconfig("rs232")) ? "enabled" : "disabled"); } } }