1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
284ad6884SPeter Tyser /*
384ad6884SPeter Tyser * Copyright (C) 2010, 2009 Matthias Kaehlcke <matthias@kaehlcke.net>
484ad6884SPeter Tyser */
584ad6884SPeter Tyser
684ad6884SPeter Tyser #include <asm/io.h>
784ad6884SPeter Tyser #include <asm/arch/ep93xx.h>
884ad6884SPeter Tyser #include <config.h>
984ad6884SPeter Tyser #include <status_led.h>
1084ad6884SPeter Tyser
112d8d190cSUri Mashiach static uint8_t saved_state[2] = {CONFIG_LED_STATUS_OFF, CONFIG_LED_STATUS_OFF};
122d8d190cSUri Mashiach static uint32_t gpio_pin[2] = {1 << CONFIG_LED_STATUS_GREEN,
132d8d190cSUri Mashiach 1 << CONFIG_LED_STATUS_RED};
1484ad6884SPeter Tyser
switch_LED_on(uint8_t led)15eada086fSTom Rini static inline void switch_LED_on(uint8_t led)
1684ad6884SPeter Tyser {
1784ad6884SPeter Tyser register struct gpio_regs *gpio = (struct gpio_regs *)GPIO_BASE;
1884ad6884SPeter Tyser
1984ad6884SPeter Tyser writel(readl(&gpio->pedr) | gpio_pin[led], &gpio->pedr);
202d8d190cSUri Mashiach saved_state[led] = CONFIG_LED_STATUS_ON;
2184ad6884SPeter Tyser }
2284ad6884SPeter Tyser
switch_LED_off(uint8_t led)23eada086fSTom Rini static inline void switch_LED_off(uint8_t led)
2484ad6884SPeter Tyser {
2584ad6884SPeter Tyser register struct gpio_regs *gpio = (struct gpio_regs *)GPIO_BASE;
2684ad6884SPeter Tyser
2784ad6884SPeter Tyser writel(readl(&gpio->pedr) & ~gpio_pin[led], &gpio->pedr);
282d8d190cSUri Mashiach saved_state[led] = CONFIG_LED_STATUS_OFF;
2984ad6884SPeter Tyser }
3084ad6884SPeter Tyser
red_led_on(void)312d3be7c4SJason Kridner void red_led_on(void)
3284ad6884SPeter Tyser {
332d8d190cSUri Mashiach switch_LED_on(CONFIG_LED_STATUS_RED);
3484ad6884SPeter Tyser }
3584ad6884SPeter Tyser
red_led_off(void)362d3be7c4SJason Kridner void red_led_off(void)
3784ad6884SPeter Tyser {
382d8d190cSUri Mashiach switch_LED_off(CONFIG_LED_STATUS_RED);
3984ad6884SPeter Tyser }
4084ad6884SPeter Tyser
green_led_on(void)412d3be7c4SJason Kridner void green_led_on(void)
4284ad6884SPeter Tyser {
432d8d190cSUri Mashiach switch_LED_on(CONFIG_LED_STATUS_GREEN);
4484ad6884SPeter Tyser }
4584ad6884SPeter Tyser
green_led_off(void)462d3be7c4SJason Kridner void green_led_off(void)
4784ad6884SPeter Tyser {
482d8d190cSUri Mashiach switch_LED_off(CONFIG_LED_STATUS_GREEN);
4984ad6884SPeter Tyser }
5084ad6884SPeter Tyser
__led_init(led_id_t mask,int state)5184ad6884SPeter Tyser void __led_init(led_id_t mask, int state)
5284ad6884SPeter Tyser {
5384ad6884SPeter Tyser __led_set(mask, state);
5484ad6884SPeter Tyser }
5584ad6884SPeter Tyser
__led_toggle(led_id_t mask)5684ad6884SPeter Tyser void __led_toggle(led_id_t mask)
5784ad6884SPeter Tyser {
582d8d190cSUri Mashiach if (CONFIG_LED_STATUS_RED == mask) {
592d8d190cSUri Mashiach if (CONFIG_LED_STATUS_ON == saved_state[CONFIG_LED_STATUS_RED])
602d3be7c4SJason Kridner red_led_off();
6184ad6884SPeter Tyser else
622d3be7c4SJason Kridner red_led_on();
632d8d190cSUri Mashiach } else if (CONFIG_LED_STATUS_GREEN == mask) {
642d8d190cSUri Mashiach if (CONFIG_LED_STATUS_ON ==
652d8d190cSUri Mashiach saved_state[CONFIG_LED_STATUS_GREEN])
662d3be7c4SJason Kridner green_led_off();
6784ad6884SPeter Tyser else
682d3be7c4SJason Kridner green_led_on();
6984ad6884SPeter Tyser }
7084ad6884SPeter Tyser }
7184ad6884SPeter Tyser
__led_set(led_id_t mask,int state)7284ad6884SPeter Tyser void __led_set(led_id_t mask, int state)
7384ad6884SPeter Tyser {
742d8d190cSUri Mashiach if (CONFIG_LED_STATUS_RED == mask) {
752d8d190cSUri Mashiach if (CONFIG_LED_STATUS_ON == state)
762d3be7c4SJason Kridner red_led_on();
7784ad6884SPeter Tyser else
782d3be7c4SJason Kridner red_led_off();
792d8d190cSUri Mashiach } else if (CONFIG_LED_STATUS_GREEN == mask) {
802d8d190cSUri Mashiach if (CONFIG_LED_STATUS_ON == state)
812d3be7c4SJason Kridner green_led_on();
8284ad6884SPeter Tyser else
832d3be7c4SJason Kridner green_led_off();
8484ad6884SPeter Tyser }
8584ad6884SPeter Tyser }
86