1/* 2 * Copyright (C) 2010, 2009 Matthias Kaehlcke <matthias@kaehlcke.net> 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7#include <asm/io.h> 8#include <asm/arch/ep93xx.h> 9#include <config.h> 10#include <status_led.h> 11 12static uint8_t saved_state[2] = {CONFIG_LED_STATUS_OFF, CONFIG_LED_STATUS_OFF}; 13static uint32_t gpio_pin[2] = {1 << CONFIG_LED_STATUS_GREEN, 14 1 << CONFIG_LED_STATUS_RED}; 15 16static inline void switch_LED_on(uint8_t led) 17{ 18 register struct gpio_regs *gpio = (struct gpio_regs *)GPIO_BASE; 19 20 writel(readl(&gpio->pedr) | gpio_pin[led], &gpio->pedr); 21 saved_state[led] = CONFIG_LED_STATUS_ON; 22} 23 24static inline void switch_LED_off(uint8_t led) 25{ 26 register struct gpio_regs *gpio = (struct gpio_regs *)GPIO_BASE; 27 28 writel(readl(&gpio->pedr) & ~gpio_pin[led], &gpio->pedr); 29 saved_state[led] = CONFIG_LED_STATUS_OFF; 30} 31 32void red_led_on(void) 33{ 34 switch_LED_on(CONFIG_LED_STATUS_RED); 35} 36 37void red_led_off(void) 38{ 39 switch_LED_off(CONFIG_LED_STATUS_RED); 40} 41 42void green_led_on(void) 43{ 44 switch_LED_on(CONFIG_LED_STATUS_GREEN); 45} 46 47void green_led_off(void) 48{ 49 switch_LED_off(CONFIG_LED_STATUS_GREEN); 50} 51 52void __led_init(led_id_t mask, int state) 53{ 54 __led_set(mask, state); 55} 56 57void __led_toggle(led_id_t mask) 58{ 59 if (CONFIG_LED_STATUS_RED == mask) { 60 if (CONFIG_LED_STATUS_ON == saved_state[CONFIG_LED_STATUS_RED]) 61 red_led_off(); 62 else 63 red_led_on(); 64 } else if (CONFIG_LED_STATUS_GREEN == mask) { 65 if (CONFIG_LED_STATUS_ON == 66 saved_state[CONFIG_LED_STATUS_GREEN]) 67 green_led_off(); 68 else 69 green_led_on(); 70 } 71} 72 73void __led_set(led_id_t mask, int state) 74{ 75 if (CONFIG_LED_STATUS_RED == mask) { 76 if (CONFIG_LED_STATUS_ON == state) 77 red_led_on(); 78 else 79 red_led_off(); 80 } else if (CONFIG_LED_STATUS_GREEN == mask) { 81 if (CONFIG_LED_STATUS_ON == state) 82 green_led_on(); 83 else 84 green_led_off(); 85 } 86} 87