13e6b86b5SThomas Chou /* 23e6b86b5SThomas Chou * Status LED driver based on GPIO access conventions of Linux 33e6b86b5SThomas Chou * 43e6b86b5SThomas Chou * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> 5ec3b4981SThomas Chou * Licensed under the GPL-2 or later. 63e6b86b5SThomas Chou */ 73e6b86b5SThomas Chou 83e6b86b5SThomas Chou #include <common.h> 93e6b86b5SThomas Chou #include <status_led.h> 103e6b86b5SThomas Chou #include <asm/gpio.h> 113e6b86b5SThomas Chou 12*9dfdcdfeSIgor Grinberg #ifndef CONFIG_GPIO_LED_INVERTED_TABLE 13*9dfdcdfeSIgor Grinberg #define CONFIG_GPIO_LED_INVERTED_TABLE {} 14*9dfdcdfeSIgor Grinberg #endif 15*9dfdcdfeSIgor Grinberg 16*9dfdcdfeSIgor Grinberg static led_id_t gpio_led_inv[] = CONFIG_GPIO_LED_INVERTED_TABLE; 17*9dfdcdfeSIgor Grinberg 18*9dfdcdfeSIgor Grinberg static int gpio_led_gpio_value(led_id_t mask, int state) 19*9dfdcdfeSIgor Grinberg { 20*9dfdcdfeSIgor Grinberg int i, gpio_value = (state == STATUS_LED_ON); 21*9dfdcdfeSIgor Grinberg 22*9dfdcdfeSIgor Grinberg for (i = 0; i < ARRAY_SIZE(gpio_led_inv); i++) { 23*9dfdcdfeSIgor Grinberg if (gpio_led_inv[i] == mask) 24*9dfdcdfeSIgor Grinberg gpio_value = !gpio_value; 25*9dfdcdfeSIgor Grinberg } 26*9dfdcdfeSIgor Grinberg 27*9dfdcdfeSIgor Grinberg return gpio_value; 28*9dfdcdfeSIgor Grinberg } 29*9dfdcdfeSIgor Grinberg 303e6b86b5SThomas Chou void __led_init(led_id_t mask, int state) 313e6b86b5SThomas Chou { 32*9dfdcdfeSIgor Grinberg int gpio_value; 33*9dfdcdfeSIgor Grinberg 346516f81bSIgor Grinberg if (gpio_request(mask, "gpio_led") != 0) { 356516f81bSIgor Grinberg printf("%s: failed requesting GPIO%lu!\n", __func__, mask); 366516f81bSIgor Grinberg return; 376516f81bSIgor Grinberg } 386516f81bSIgor Grinberg 39*9dfdcdfeSIgor Grinberg gpio_value = gpio_led_gpio_value(mask, state); 40*9dfdcdfeSIgor Grinberg gpio_direction_output(mask, gpio_value); 413e6b86b5SThomas Chou } 423e6b86b5SThomas Chou 433e6b86b5SThomas Chou void __led_set(led_id_t mask, int state) 443e6b86b5SThomas Chou { 45*9dfdcdfeSIgor Grinberg int gpio_value = gpio_led_gpio_value(mask, state); 46*9dfdcdfeSIgor Grinberg 47*9dfdcdfeSIgor Grinberg gpio_set_value(mask, gpio_value); 483e6b86b5SThomas Chou } 493e6b86b5SThomas Chou 503e6b86b5SThomas Chou void __led_toggle(led_id_t mask) 513e6b86b5SThomas Chou { 523e6b86b5SThomas Chou gpio_set_value(mask, !gpio_get_value(mask)); 533e6b86b5SThomas Chou } 54