diff options
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/danube/files/drivers/char/danube_led.c | 297 | ||||
-rw-r--r-- | target/linux/danube/files/include/asm-mips/danube/danube.h | 15 |
2 files changed, 69 insertions, 243 deletions
diff --git a/target/linux/danube/files/drivers/char/danube_led.c b/target/linux/danube/files/drivers/char/danube_led.c index f832fa032e..1f7dda9a69 100644 --- a/target/linux/danube/files/drivers/char/danube_led.c +++ b/target/linux/danube/files/drivers/char/danube_led.c @@ -18,7 +18,6 @@ * */ -#include <linux/config.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/version.h> @@ -29,39 +28,15 @@ #include <asm/uaccess.h> #include <asm/unistd.h> #include <linux/errno.h> - -/* - * Chip Specific Head File - */ +#include <asm/danube/danube.h> #include <asm/danube/port.h> - #include <asm/danube/danube_led.h> #include <asm/danube/danube_gptu.h> - -/* - * #################################### - * Definition - * #################################### - */ - -#define DEBUG_ON_AMAZON 0 - #define DATA_CLOCKING_EDGE FALLING_EDGE - -#define BOARD_TYPE REFERENCE_BOARD - -#define DEBUG_WRITE_REGISTER 0 - #define RISING_EDGE 0 #define FALLING_EDGE 1 -#define EVALUATION_BOARD 0 -#define REFERENCE_BOARD 1 - -/* - * GPIO Driver Function Wrapping - */ #define port_reserve_pin danube_port_reserve_pin #define port_free_pin danube_port_free_pin #define port_set_altsel0 danube_port_set_altsel0 @@ -73,9 +48,6 @@ #define port_set_open_drain danube_port_set_open_drain #define port_clear_open_drain danube_port_clear_open_drain -/* - * GPIO Port Used By LED - */ #define LED_SH_PORT 0 #define LED_SH_PIN 4 #define LED_SH_DIR 1 @@ -119,9 +91,6 @@ #define ADSL_LED_IS_EXCLUSIVE 0 #endif -/* - * Define GPIO Functions - */ #if LED_SH_DIR #define LED_SH_DIR_SETUP port_set_dir_out #else @@ -227,115 +196,10 @@ #define LED_ADSL1_OPENDRAIN_SETUP port_clear_open_drain #endif -/* - * LED Device Minor Number - */ -#if !defined(LED_MINOR) - #define LED_MINOR 151 // This number is written in Linux kernel document "devices.txt" -#endif // !defined(LED_MINOR) - -/* - * Bits Operation - */ -#define GET_BITS(x, msb, lsb) (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb)) #define SET_BITS(x, msb, lsb, value) (((x) & ~(((1 << ((msb) + 1)) - 1) ^ ((1 << (lsb)) - 1))) | (((value) & ((1 << (1 + (msb) - (lsb))) - 1)) << (lsb))) -/* - * LED Registers Mapping - */ -#define DANUBE_LED (KSEG1 + 0x1E100BB0) -#define DANUBE_LED_CON0 ((volatile unsigned int*)(DANUBE_LED + 0x0000)) -#define DANUBE_LED_CON1 ((volatile unsigned int*)(DANUBE_LED + 0x0004)) -#define DANUBE_LED_CPU0 ((volatile unsigned int*)(DANUBE_LED + 0x0008)) -#define DANUBE_LED_CPU1 ((volatile unsigned int*)(DANUBE_LED + 0x000C)) -#define DANUBE_LED_AR ((volatile unsigned int*)(DANUBE_LED + 0x0010)) - -/* - * LED Control 0 Register - */ -#define LED_CON0_SWU (*DANUBE_LED_CON0 & (1 << 31)) -#define LED_CON0_FALLING_EDGE (*DANUBE_LED_CON0 & (1 << 26)) -#define LED_CON0_AD1 (*DANUBE_LED_CON0 & (1 << 25)) -#define LED_CON0_AD0 (*DANUBE_LED_CON0 & (1 << 24)) -#define LED_CON0_LBn(n) (*DANUBE_LED_CON0 & (1 << n)) -#define LED_CON0_DEFAULT_VALUE (0x80000000 | (DATA_CLOCKING_EDGE << 26)) - -/* - * LED Control 1 Register - */ -#define LED_CON1_US (*DANUBE_LED_CON1 >> 30) -#define LED_CON1_SCS (*DANUBE_LED_CON1 & (1 << 28)) -#define LED_CON1_FPID GET_BITS(*DANUBE_LED_CON1, 27, 23) -#define LED_CON1_FPIS GET_BITS(*DANUBE_LED_CON1, 21, 20) -#define LED_CON1_DO GET_BITS(*DANUBE_LED_CON1, 19, 18) -#define LED_CON1_G2 (*DANUBE_LED_CON1 & (1 << 2)) -#define LED_CON1_G1 (*DANUBE_LED_CON1 & (1 << 1)) -#define LED_CON1_G0 (*DANUBE_LED_CON1 & 0x01) -#define LED_CON1_G (*DANUBE_LED_CON1 & 0x07) -#define LED_CON1_DEFAULT_VALUE 0x00000000 - -/* - * LED Data Output CPU 0 Register - */ -#define LED_CPU0_Ln(n) (*DANUBE_LED_CPU0 & (1 << n)) -#define LED_LED_CPU0_DEFAULT_VALUE 0x00000000 - -/* - * LED Data Output CPU 1 Register - */ -#define LED_CPU1_Ln(n) (*DANUBE_LED_CPU1 & (1 << n)) -#define LED_LED_CPU1_DEFAULT_VALUE 0x00000000 - -/* - * LED Data Output Access Rights Register - */ -#define LED_AR_Ln(n) (*DANUBE_LED_AR & (1 << n)) -#define LED_AR_DEFAULT_VALUE 0x00000000 - -/* - * If try module on Amazon chip, prepare some tricks to prevent invalid memory write. - */ -#if defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON - char g_pFakeRegisters[0x50]; - - #undef DEBUG_WRITE_REGISTER - - #undef DANUBE_LED - #define DANUBE_LED g_pFakeRegisters - - #undef port_reserve_pin - #undef port_free_pin - #undef port_set_altsel0 - #undef port_clear_altsel0 - #undef port_set_altsel1 - #undef port_clear_altsel1 - #undef port_set_dir_out - - #define port_reserve_pin amazon_port_reserve_pin - #define port_free_pin amazon_port_free_pin - #define port_set_altsel0 amazon_port_set_altsel0 - #define port_clear_altsel0 amazon_port_clear_altsel0 - #define port_set_altsel1 amazon_port_set_altsel1 - #define port_clear_altsel1 amazon_port_clear_altsel1 - #define port_set_dir_out amazon_port_set_dir_out -#endif // defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON - - -/* - * File Operations - */ -static int led_ioctl(struct inode *, struct file *, unsigned int, unsigned long); -static int led_open(struct inode *, struct file *); -static int led_release(struct inode *, struct file *); - -/* - * Software Update LED - */ static inline int update_led(void); -/* - * LED Configuration Functions - */ static inline unsigned int set_update_source(unsigned int, unsigned long, unsigned long); static inline unsigned int set_blink_in_batch(unsigned int, unsigned long, unsigned long); static inline unsigned int set_data_clock_edge(unsigned int, unsigned long); @@ -347,49 +211,21 @@ static inline unsigned int set_number_of_enabled_led(unsigned int, unsigned long static inline unsigned int set_data_in_batch(unsigned int, unsigned long, unsigned long); static inline unsigned int set_access_right(unsigned int, unsigned long, unsigned long); -/* - * PMU Operation - */ static inline void enable_led(void); static inline void disable_led(void); -/* - * GPIO Setup & Release - */ static inline int setup_gpio_port(unsigned long); static inline void release_gpio_port(unsigned long); -/* - * GPT Setup & Release - */ static inline int setup_gpt(int, unsigned long); static inline void release_gpt(int); -/* - * Turn On/Off LED - */ static inline int turn_on_led(unsigned long); static inline void turn_off_led(unsigned long); static struct semaphore led_sem; -static struct file_operations led_fops = { - owner: THIS_MODULE, - ioctl: led_ioctl, - open: led_open, - release: led_release -}; - -static struct miscdevice led_miscdev = { - LED_MINOR, - "led", - &led_fops, - NULL, - NULL, - NULL -}; - static unsigned long gpt_on = 0; static unsigned long gpt_freq = 0; @@ -399,35 +235,6 @@ static unsigned long f_led_on = 0; static int module_id; -static int -led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) -{ - int ret = -EINVAL; - struct led_config_param param; - - switch ( cmd ) - { - case LED_CONFIG: - copy_from_user(¶m, (char*)arg, sizeof(param)); - ret = danube_led_config(¶m); - break; - } - - return ret; -} - -static int -led_open (struct inode *inode, struct file *file) -{ - return 0; -} - -static int -led_release (struct inode *inode, struct file *file) -{ - return 0; -} - static inline int update_led (void) { @@ -436,7 +243,7 @@ update_led (void) /* * GPT2 or FPID is the clock to update LEDs automatically. */ - if ( LED_CON1_US != 0 ) + if (readl(DANUBE_LED_CON1) >> 30) return 0; /* @@ -445,7 +252,7 @@ update_led (void) for ( i = 100000; i != 0; i -= j / 16 ) { down(&led_sem); - if ( !LED_CON0_SWU ) + if (!(readl(DANUBE_LED_CON0) & LED_CON0_SWU)) { *DANUBE_LED_CON0 |= 1 << 31; up(&led_sem); @@ -531,7 +338,6 @@ set_access_right (unsigned int reg, unsigned long mask, unsigned long ar) static inline void enable_led (void) { -#if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON /* Activate LED module in PMU. */ int i = 1000000; @@ -539,42 +345,19 @@ enable_led (void) while ( --i && (*(unsigned long *)0xBF102020 & (1 << 11)) ); if ( !i ) panic("Activating LED in PMU failed!"); -#endif } static inline void disable_led (void) { -#if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON - /* Inactivating LED module in PMU. */ *(unsigned long *)0xBF10201C |= 1 << 11; -#endif } static inline int setup_gpio_port (unsigned long adsl) { -#if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON int ret = 0; - #if defined(DEBUG_WRITE_REGISTER) && DEBUG_WRITE_REGISTER - if ( adsl ) - { - *(unsigned long *)0xBE100B18 |= 0x30; - *(unsigned long *)0xBE100B1C |= 0x20; - *(unsigned long *)0xBE100B1C &= ~0x10; - *(unsigned long *)0xBE100B20 |= 0x30; - *(unsigned long *)0xBE100B24 |= 0x30; - } - else - { - *(unsigned long *)0xBE100B18 |= 0x70; - *(unsigned long *)0xBE100B1C |= 0x70; - *(unsigned long *)0xBE100B20 &= ~0x70; - *(unsigned long *)0xBE100B24 |= 0x70; - } - #else - /* * Reserve all pins before config them. */ @@ -635,8 +418,6 @@ setup_gpio_port (unsigned long adsl) LED_SH_DIR_SETUP(LED_SH_PORT, LED_SH_PIN, module_id); LED_SH_OPENDRAIN_SETUP(LED_SH_PORT, LED_SH_PIN, module_id); } - #endif -#endif return 0; } @@ -644,8 +425,6 @@ setup_gpio_port (unsigned long adsl) static inline void release_gpio_port (unsigned long adsl) { -#if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON - #if !defined(DEBUG_WRITE_REGISTER) || !DEBUG_WRITE_REGISTER if ( adsl ) { port_free_pin(LED_ADSL0_PORT, LED_ADSL0_PIN, module_id); @@ -657,8 +436,6 @@ release_gpio_port (unsigned long adsl) port_free_pin(LED_D_PORT, LED_D_PIN, module_id); port_free_pin(LED_SH_PORT, LED_SH_PIN, module_id); } - #endif -#endif } static inline int @@ -735,7 +512,7 @@ danube_led_set_blink (unsigned int led, unsigned int blink) *DANUBE_LED_CON0 &= ~bit_mask; up(&led_sem); - return (led == 0 && LED_CON0_AD0) || (led == 1 && LED_CON0_AD1) ? -EINVAL : 0; + return (led == 0 && (readl(DANUBE_LED_CON0) & LED_CON0_AD0)) || (led == 1 && (readl(DANUBE_LED_CON0) & LED_CON0_AD1)) ? -EINVAL : 0; } int @@ -786,7 +563,7 @@ danube_led_config (struct led_config_param* param) f_setup_gpt2 = 0; - f_software_update = LED_CON0_SWU ? 0 : 1; + f_software_update = (readl(DANUBE_LED_CON0) & LED_CON0_SWU) ? 0 : 1; new_led_on = f_led_on; new_adsl_on = adsl_on; @@ -968,10 +745,6 @@ danube_led_config (struct led_config_param* param) if ( !f_led_on ) disable_led(); -#if defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON - *DANUBE_LED_CON0 &= 0x7FFFFFFF; -#endif - up(&led_sem); return 0; @@ -987,6 +760,50 @@ INVALID_PARAM: return -EINVAL; } +static int +led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = -EINVAL; + struct led_config_param param; + + switch ( cmd ) + { + case LED_CONFIG: + copy_from_user(¶m, (char*)arg, sizeof(param)); + ret = danube_led_config(¶m); + break; + } + + return ret; +} + +static int +led_open (struct inode *inode, struct file *file) +{ + return 0; +} + +static int +led_release (struct inode *inode, struct file *file) +{ + return 0; +} + +static struct file_operations led_fops = { + owner: THIS_MODULE, + ioctl: led_ioctl, + open: led_open, + release: led_release +}; + +static struct miscdevice led_miscdev = { + 151, + "led", + &led_fops, + NULL, + NULL, + NULL +}; int __init danube_led_init (void) @@ -999,15 +816,11 @@ danube_led_init (void) /* * Set default value to registers to turn off all LED light. */ - *DANUBE_LED_AR = LED_AR_DEFAULT_VALUE; - *DANUBE_LED_CPU0 = LED_LED_CPU0_DEFAULT_VALUE; - *DANUBE_LED_CPU1 = LED_LED_CPU1_DEFAULT_VALUE; - *DANUBE_LED_CON1 = LED_CON1_DEFAULT_VALUE; - *DANUBE_LED_CON0 = LED_CON0_DEFAULT_VALUE; - -#if defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON - *DANUBE_LED_CON0 &= 0x7FFFFFFF; -#endif + *DANUBE_LED_AR = 0x0; + *DANUBE_LED_CPU0 = 0x0; + *DANUBE_LED_CPU1 = 0x0; + *DANUBE_LED_CON1 = 0x0; + *DANUBE_LED_CON0 = (0x80000000 | (DATA_CLOCKING_EDGE << 26)); disable_led(); @@ -1031,7 +844,6 @@ danube_led_init (void) up(&led_sem); -#if BOARD_TYPE == REFERENCE_BOARD /* Add to enable hardware relay */ /* Map for LED on reference board WLAN_READ LED11 OUT1 15 @@ -1055,7 +867,6 @@ danube_led_init (void) param.data_mask = 1 << 4; param.data = 1 << 4; danube_led_config(¶m); -#endif // by default, update by FSC clock (FPID) param.operation_mask = CONFIG_OPERATION_UPDATE_CLOCK; diff --git a/target/linux/danube/files/include/asm-mips/danube/danube.h b/target/linux/danube/files/include/asm-mips/danube/danube.h index 5809fd94cd..34feb88ca6 100644 --- a/target/linux/danube/files/include/asm-mips/danube/danube.h +++ b/target/linux/danube/files/include/asm-mips/danube/danube.h @@ -304,4 +304,19 @@ #define DANUBE_BIU_WDT_CR_CLKDIV_SET(value) (((( 1 << 2) - 1) & (value)) << 24) #define DANUBE_BIU_WDT_CR_RELOAD_SET(value) (((( 1 << 16) - 1) & (value)) << 0) + +/*------------ LED */ + +#define DANUBE_LED_BASE_ADDR (KSEG1 + 0x1E100BB0) +#define DANUBE_LED_CON0 ((u32*)(DANUBE_LED_BASE_ADDR + 0x0000)) +#define DANUBE_LED_CON1 ((u32*)(DANUBE_LED_BASE_ADDR + 0x0004)) +#define DANUBE_LED_CPU0 ((u32*)(DANUBE_LED_BASE_ADDR + 0x0008)) +#define DANUBE_LED_CPU1 ((u32*)(DANUBE_LED_BASE_ADDR + 0x000C)) +#define DANUBE_LED_AR ((u32*)(DANUBE_LED_BASE_ADDR + 0x0010)) + + +#define LED_CON0_SWU (1 << 31) +#define LED_CON0_AD1 (1 << 25) +#define LED_CON0_AD0 (1 << 24) + #endif |