static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int gpio; enum gpio_cmd sub_cmd; ulong value; const char *str_cmd, *str_gpio; #ifdef gpio_status if (argc == 2 && !strcmp(argv[1], "status")) { gpio_status(); return 0; } #endif if (argc != 3) show_usage: return CMD_RET_USAGE; str_cmd = argv[1]; str_gpio = argv[2]; /* parse the behavior */ switch (*str_cmd) { case 'i': sub_cmd = CMD_GPIO_INPUT; break; case 's': sub_cmd = CMD_GPIO_SET; break; case 'c': sub_cmd = CMD_GPIO_CLEAR; break; case 't': sub_cmd = CMD_GPIO_TOGGLE; break; default: goto show_usage; } /* turn the gpio name into a gpio number */ gpio = name_to_gpio(str_gpio); if (gpio < 0) goto show_usage; /* grab the pin before we tweak it */ if (gpio_request(gpio, "cmd_gpio")) { printf("gpio: requesting pin %u failed\n", gpio); return -1; } /* finally, let's do it: set direction and exec command */ if (sub_cmd == CMD_GPIO_INPUT) { gpio_direction_input(gpio); value = gpio_get_value(gpio); } else { switch (sub_cmd) { case CMD_GPIO_SET: value = 1; break; case CMD_GPIO_CLEAR: value = 0; break; case CMD_GPIO_TOGGLE: value = !gpio_get_value(gpio); break; default: goto show_usage; } gpio_direction_output(gpio, value); } printf("gpio: pin %s (gpio %i) value is %lu\n", str_gpio, gpio, value); gpio_free(gpio); return value; }
int hitachi_tx18d42vm_init(void) { const u16 init_data[] = { 0x0029, /* reset */ 0x0025, /* standby */ 0x0840, /* enable normally black */ 0x0430, /* enable FRC/dither */ 0x385f, /* enter test mode(1) */ 0x3ca4, /* enter test mode(2) */ 0x3409, /* enable SDRRS, enlarge OE width */ 0x4041, /* adopt 2 line / 1 dot */ }; int i, cs, clk, mosi, ret = 0; cs = name_to_gpio(CONFIG_VIDEO_LCD_SPI_CS); clk = name_to_gpio(CONFIG_VIDEO_LCD_SPI_SCLK); mosi = name_to_gpio(CONFIG_VIDEO_LCD_SPI_MOSI); if (cs == -1 || clk == -1 || mosi == 1) { printf("Error tx18d42vm spi gpio config is invalid\n"); return -EINVAL; } if (gpio_request(cs, "tx18d42vm-spi-cs") != 0 || gpio_request(clk, "tx18d42vm-spi-clk") != 0 || gpio_request(mosi, "tx18d42vm-spi-mosi") != 0) { printf("Error cannot request tx18d42vm spi gpios\n"); ret = -EBUSY; goto out; } for (i = 0; i < ARRAY_SIZE(init_data); i++) lcd_panel_spi_write(cs, clk, mosi, init_data[i], 16); mdelay(50); /* All the tx18d42vm drivers have a delay here ? */ lcd_panel_spi_write(cs, clk, mosi, 0x00ad, 16); /* display on */ out: gpio_free(mosi); gpio_free(clk); gpio_free(cs); return ret; }
static int sun4i_spi_parse_pins(struct udevice *dev) { const void *fdt = gd->fdt_blob; const char *pin_name; const fdt32_t *list; u32 phandle; int drive, pull = 0, pin, i; int offset; int size; list = fdt_getprop(fdt, dev_of_offset(dev), "pinctrl-0", &size); if (!list) { printf("WARNING: sun4i_spi: cannot find pinctrl-0 node\n"); return -EINVAL; } while (size) { phandle = fdt32_to_cpu(*list++); size -= sizeof(*list); offset = fdt_node_offset_by_phandle(fdt, phandle); if (offset < 0) return offset; drive = fdt_getprop_u32_default_node(fdt, offset, 0, "drive-strength", 0); if (drive) { if (drive <= 10) drive = 0; else if (drive <= 20) drive = 1; else if (drive <= 30) drive = 2; else drive = 3; } else { drive = fdt_getprop_u32_default_node(fdt, offset, 0, "allwinner,drive", 0); drive = min(drive, 3); } if (fdt_get_property(fdt, offset, "bias-disable", NULL)) pull = 0; else if (fdt_get_property(fdt, offset, "bias-pull-up", NULL)) pull = 1; else if (fdt_get_property(fdt, offset, "bias-pull-down", NULL)) pull = 2; else pull = fdt_getprop_u32_default_node(fdt, offset, 0, "allwinner,pull", 0); pull = min(pull, 2); for (i = 0; ; i++) { pin_name = fdt_stringlist_get(fdt, offset, "pins", i, NULL); if (!pin_name) { pin_name = fdt_stringlist_get(fdt, offset, "allwinner,pins", i, NULL); if (!pin_name) break; } pin = name_to_gpio(pin_name); if (pin < 0) break; sunxi_gpio_set_cfgpin(pin, SUNXI_GPC_SPI0); sunxi_gpio_set_drv(pin, drive); sunxi_gpio_set_pull(pin, pull); } } return 0; }
static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { unsigned int gpio; enum gpio_cmd sub_cmd; ulong value; const char *str_cmd, *str_gpio = NULL; int ret; #ifdef CONFIG_DM_GPIO bool all = false; #endif if (argc < 2) show_usage: return CMD_RET_USAGE; str_cmd = argv[1]; argc -= 2; argv += 2; #ifdef CONFIG_DM_GPIO if (argc > 0 && !strcmp(*argv, "-a")) { all = true; argc--; argv++; } #endif if (argc > 0) str_gpio = *argv; if (!strcmp(str_cmd, "status")) { /* Support deprecated gpio_status() */ #ifdef gpio_status gpio_status(); return 0; #elif defined(CONFIG_DM_GPIO) return cmd_process_error(cmdtp, do_gpio_status(all, str_gpio)); #else goto show_usage; #endif } if (!str_gpio) goto show_usage; /* parse the behavior */ switch (*str_cmd) { case 'i': sub_cmd = GPIO_INPUT; break; case 's': sub_cmd = GPIO_SET; break; case 'c': sub_cmd = GPIO_CLEAR; break; case 't': sub_cmd = GPIO_TOGGLE; break; default: goto show_usage; } #if defined(CONFIG_DM_GPIO) /* * TODO([email protected]): For now we must fit into the existing GPIO * framework, so we look up the name here and convert it to a GPIO number. * Once all GPIO drivers are converted to driver model, we can change the * code here to use the GPIO uclass interface instead of the numbered * GPIO compatibility layer. */ ret = gpio_lookup_name(str_gpio, NULL, NULL, &gpio); if (ret) return cmd_process_error(cmdtp, ret); #else /* turn the gpio name into a gpio number */ gpio = name_to_gpio(str_gpio); if (gpio < 0) goto show_usage; #endif /* grab the pin before we tweak it */ ret = gpio_request(gpio, "cmd_gpio"); if (ret && ret != -EBUSY) { printf("gpio: requesting pin %u failed\n", gpio); return -1; } /* finally, let's do it: set direction and exec command */ if (sub_cmd == GPIO_INPUT) { gpio_direction_input(gpio); value = gpio_get_value(gpio); } else { switch (sub_cmd) { case GPIO_SET: value = 1; break; case GPIO_CLEAR: value = 0; break; case GPIO_TOGGLE: value = !gpio_get_value(gpio); break; default: goto show_usage; } gpio_direction_output(gpio, value); } printf("gpio: pin %s (gpio %i) value is %lu\n", str_gpio, gpio, value); if (ret != -EBUSY) gpio_free(gpio); return value; }