/* * * puma5_board_led.c * Description: * LED configuration data for board * * * Copyright (C) 2008, Texas Instruments, Incorporated * * This program is free software; you can distribute it and/or modify it * under the terms of the GNU General Public License (Version 2) as * published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. * */ #include #include #include typedef struct { unsigned int bit_pos0; unsigned int bit_val0; unsigned int bit_pos1; unsigned int bit_val1; } LED_POS_VAL_T; #define SOC_LED #define SOC_DOMAIN 0 #ifdef CONFIG_MACH_PUMA5EVM enum { GPIO0_LED_POWER = 0, GPIO1_LED_ONLINE, GPIO2_LED_LINE1, GPIO3_LED_LINE2, GPIO4_LED_LINE3, GPIO5_LED_LINE4, GPIO8_LED_BAT = 8, GPIO12_LED_LINK_ACT = 12, GPIO16_LED_DS = 16, GPIO17_LED_US, NO_LED_BIT = 0xFFFFFFFF }; enum { LED_POWER_IDX = 0, LED_ONLINE_IDX, LED_LINE1_IDX, LED_LINE2_IDX, LED_LINE3_IDX, LED_LINE4_IDX, LED_BAT_IDX, LED_LINK_ACT_IDX, LED_DS_IDX, LED_US_IDX, }; static LED_POS_VAL_T soc_led_pos_val[ ] = { {GPIO0_LED_POWER,0,NO_LED_BIT,0}, {GPIO1_LED_ONLINE,1,NO_LED_BIT,0}, {GPIO2_LED_LINE1,1,NO_LED_BIT,0}, {GPIO3_LED_LINE2,1,NO_LED_BIT,0}, {GPIO4_LED_LINE3,1,NO_LED_BIT,0}, {GPIO5_LED_LINE4,1,NO_LED_BIT,0}, {GPIO8_LED_BAT,1,NO_LED_BIT,0}, {GPIO12_LED_LINK_ACT,1,NO_LED_BIT,0}, {GPIO16_LED_DS,1,NO_LED_BIT,0}, {GPIO17_LED_US,1,NO_LED_BIT,0} }; static unsigned int soc_led_count = sizeof(soc_led_pos_val)/sizeof(soc_led_pos_val[0]); #elif defined(NEW_BOARD) #else #undef SOC_LED #endif #ifdef SOC_LED static void _map_led_pos_and_val(int bit, unsigned val, unsigned int *pos_map0, unsigned int *val_map0, unsigned int *pos_map1, unsigned int *val_map1) { if(bit > 31) { bit -= 32; *pos_map1 |= (1 << bit); if ( val ) *val_map1 |= (1 << bit); else *val_map1 &= ~(1 << bit); } else { *pos_map0 |= (1 << bit); if ( val ) *val_map0 |= (1 << bit); else *val_map0 &= ~(1 << bit); } return; } static void map_led_pos_and_val(LED_POS_VAL_T *p_pos_val, unsigned int *pos_map0, unsigned int *val_map0, unsigned int *pos_map1, unsigned int *val_map1) { if(p_pos_val->bit_pos0 != NO_LED_BIT) _map_led_pos_and_val(p_pos_val->bit_pos0, p_pos_val->bit_val0, pos_map0, val_map0, pos_map1, val_map1); if(p_pos_val->bit_pos1 != NO_LED_BIT) _map_led_pos_and_val(p_pos_val->bit_pos1, p_pos_val->bit_val1, pos_map0, val_map0, pos_map1, val_map1); return; } static void puma5_soc_led_callback_install(LED_POS_VAL_T *p_pos_val, int led_count) { LED_FUNCS_T led_funcs; int i; for(i=0; i < led_count; i++) { unsigned int pos_map0 = 0, val_map0 = 0, pos_map1 = 0, val_map1 = 0; map_led_pos_and_val(p_pos_val, &pos_map0, &val_map0, &pos_map1, &val_map1); led_funcs.domain = SOC_DOMAIN; led_funcs.pos_map[0] = pos_map0; led_funcs.pos_map[1] = pos_map1; led_funcs.off_val[0] = val_map0; led_funcs.off_val[1] = val_map1; led_funcs.outVal = PAL_sysGpioOutValue; led_manager_install_callbacks(&led_funcs); p_pos_val++; } return; } static void puma5_soc_led_gpio_enable(LED_POS_VAL_T *p_pos_val, int led_count) { int i = 0; for(i=0; i < led_count; i++) { if(p_pos_val->bit_pos0 != NO_LED_BIT) PAL_sysGpioCtrl(p_pos_val->bit_pos0, GPIO_PIN, GPIO_OUTPUT_PIN); if(p_pos_val->bit_pos1 != NO_LED_BIT) PAL_sysGpioCtrl(p_pos_val->bit_pos1, GPIO_PIN, GPIO_OUTPUT_PIN); p_pos_val++; } } static void puma5_soc_led_gpio_init(LED_POS_VAL_T *p_pos_val, int led_count) { int i = 0; for(i=0; i < led_count; i++) { unsigned int pos_map0 = 0, val_map0 = 0, pos_map1 = 0, val_map1 = 0; map_led_pos_and_val(p_pos_val, &pos_map0, &val_map0, &pos_map1, &val_map1); if(pos_map0) PAL_sysGpioOutValue(val_map0, pos_map0, 0 /*reg_index*/); if(pos_map1) PAL_sysGpioOutValue(val_map1, pos_map1, 1 /*reg_index*/); p_pos_val++; } return; } extern int led_manager_init(void); #endif static int led_callback_init(void) { #ifdef SOC_LED extern char *puma5_boardtype; if ( strcmp( puma5_boardtype, "tnetc958" ) == 0 ) { /* Line 3 and Line 4 LEDs are not available in the tnetc958 design */ soc_led_pos_val[ LED_LINE3_IDX ].bit_pos0 = NO_LED_BIT; soc_led_pos_val[ LED_LINE4_IDX ].bit_pos0 = NO_LED_BIT; } /* Enabling and Initialiasing the GPIO's mapped for the LED(s) */ puma5_soc_led_gpio_enable(&soc_led_pos_val[0], soc_led_count); puma5_soc_led_gpio_init(&soc_led_pos_val[0], soc_led_count); led_manager_init(); puma5_soc_led_callback_install(&soc_led_pos_val[0], soc_led_count); #endif return (0); } __initcall(led_callback_init);