Changeset 9733


Ignore:
Timestamp:
2007-12-13T21:51:57+01:00 (9 years ago)
Author:
blogic
Message:

danube led cleanup

Location:
trunk/target/linux/danube/files
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/danube/files/drivers/char/danube_led.c

    r9732 r9733  
    1919 */ 
    2020 
    21 #include <linux/config.h> 
    2221#include <linux/kernel.h> 
    2322#include <linux/module.h> 
     
    3029#include <asm/unistd.h> 
    3130#include <linux/errno.h> 
    32  
    33 /* 
    34  *  Chip Specific Head File 
    35  */ 
     31#include <asm/danube/danube.h> 
    3632#include <asm/danube/port.h> 
    37  
    3833#include <asm/danube/danube_led.h> 
    3934#include <asm/danube/danube_gptu.h> 
    4035 
    41  
    42 /* 
    43  * #################################### 
    44  *              Definition 
    45  * #################################### 
    46  */ 
    47  
    48 #define DEBUG_ON_AMAZON                 0 
    49  
    5036#define DATA_CLOCKING_EDGE              FALLING_EDGE 
    51  
    52 #define BOARD_TYPE                      REFERENCE_BOARD 
    53  
    54 #define DEBUG_WRITE_REGISTER            0 
    55  
    5637#define RISING_EDGE                     0 
    5738#define FALLING_EDGE                    1 
    5839 
    59 #define EVALUATION_BOARD                0 
    60 #define REFERENCE_BOARD                 1 
    61  
    62 /* 
    63  *  GPIO Driver Function Wrapping 
    64  */ 
    6540#define port_reserve_pin                danube_port_reserve_pin 
    6641#define port_free_pin                   danube_port_free_pin 
     
    7449#define port_clear_open_drain           danube_port_clear_open_drain 
    7550 
    76 /* 
    77  *  GPIO Port Used By LED 
    78  */ 
    7951#define LED_SH_PORT                     0 
    8052#define LED_SH_PIN                      4 
     
    12092#endif 
    12193 
    122 /* 
    123  *  Define GPIO Functions 
    124  */ 
    12594#if LED_SH_DIR 
    12695  #define LED_SH_DIR_SETUP              port_set_dir_out 
     
    228197#endif 
    229198 
    230 /* 
    231  *  LED Device Minor Number 
    232  */ 
    233 #if !defined(LED_MINOR) 
    234     #define LED_MINOR                   151 //  This number is written in Linux kernel document "devices.txt" 
    235 #endif  //  !defined(LED_MINOR) 
    236  
    237 /* 
    238  *  Bits Operation 
    239  */ 
    240 #define GET_BITS(x, msb, lsb)           (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb)) 
    241199#define SET_BITS(x, msb, lsb, value)    (((x) & ~(((1 << ((msb) + 1)) - 1) ^ ((1 << (lsb)) - 1))) | (((value) & ((1 << (1 + (msb) - (lsb))) - 1)) << (lsb))) 
    242200 
    243 /* 
    244  *  LED Registers Mapping 
    245  */ 
    246 #define DANUBE_LED                      (KSEG1 + 0x1E100BB0) 
    247 #define DANUBE_LED_CON0                 ((volatile unsigned int*)(DANUBE_LED + 0x0000)) 
    248 #define DANUBE_LED_CON1                 ((volatile unsigned int*)(DANUBE_LED + 0x0004)) 
    249 #define DANUBE_LED_CPU0                 ((volatile unsigned int*)(DANUBE_LED + 0x0008)) 
    250 #define DANUBE_LED_CPU1                 ((volatile unsigned int*)(DANUBE_LED + 0x000C)) 
    251 #define DANUBE_LED_AR                   ((volatile unsigned int*)(DANUBE_LED + 0x0010)) 
    252  
    253 /* 
    254  *  LED Control 0 Register 
    255  */ 
    256 #define LED_CON0_SWU                    (*DANUBE_LED_CON0 & (1 << 31)) 
    257 #define LED_CON0_FALLING_EDGE           (*DANUBE_LED_CON0 & (1 << 26)) 
    258 #define LED_CON0_AD1                    (*DANUBE_LED_CON0 & (1 << 25)) 
    259 #define LED_CON0_AD0                    (*DANUBE_LED_CON0 & (1 << 24)) 
    260 #define LED_CON0_LBn(n)                 (*DANUBE_LED_CON0 & (1 << n)) 
    261 #define LED_CON0_DEFAULT_VALUE          (0x80000000 | (DATA_CLOCKING_EDGE << 26)) 
    262  
    263 /* 
    264  *  LED Control 1 Register 
    265  */ 
    266 #define LED_CON1_US                     (*DANUBE_LED_CON1 >> 30) 
    267 #define LED_CON1_SCS                    (*DANUBE_LED_CON1 & (1 << 28)) 
    268 #define LED_CON1_FPID                   GET_BITS(*DANUBE_LED_CON1, 27, 23) 
    269 #define LED_CON1_FPIS                   GET_BITS(*DANUBE_LED_CON1, 21, 20) 
    270 #define LED_CON1_DO                     GET_BITS(*DANUBE_LED_CON1, 19, 18) 
    271 #define LED_CON1_G2                     (*DANUBE_LED_CON1 & (1 << 2)) 
    272 #define LED_CON1_G1                     (*DANUBE_LED_CON1 & (1 << 1)) 
    273 #define LED_CON1_G0                     (*DANUBE_LED_CON1 & 0x01) 
    274 #define LED_CON1_G                      (*DANUBE_LED_CON1 & 0x07) 
    275 #define LED_CON1_DEFAULT_VALUE          0x00000000 
    276  
    277 /* 
    278  *  LED Data Output CPU 0 Register 
    279  */ 
    280 #define LED_CPU0_Ln(n)                  (*DANUBE_LED_CPU0 & (1 << n)) 
    281 #define LED_LED_CPU0_DEFAULT_VALUE      0x00000000 
    282  
    283 /* 
    284  *  LED Data Output CPU 1 Register 
    285  */ 
    286 #define LED_CPU1_Ln(n)                  (*DANUBE_LED_CPU1 & (1 << n)) 
    287 #define LED_LED_CPU1_DEFAULT_VALUE      0x00000000 
    288  
    289 /* 
    290  *  LED Data Output Access Rights Register 
    291  */ 
    292 #define LED_AR_Ln(n)                    (*DANUBE_LED_AR & (1 << n)) 
    293 #define LED_AR_DEFAULT_VALUE            0x00000000 
    294  
    295 /* 
    296  *  If try module on Amazon chip, prepare some tricks to prevent invalid memory write. 
    297  */ 
    298 #if defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON 
    299     char g_pFakeRegisters[0x50]; 
    300  
    301     #undef  DEBUG_WRITE_REGISTER 
    302  
    303     #undef  DANUBE_LED 
    304     #define DANUBE_LED                  g_pFakeRegisters 
    305  
    306     #undef  port_reserve_pin 
    307     #undef  port_free_pin 
    308     #undef  port_set_altsel0 
    309     #undef  port_clear_altsel0 
    310     #undef  port_set_altsel1 
    311     #undef  port_clear_altsel1 
    312     #undef  port_set_dir_out 
    313  
    314     #define port_reserve_pin            amazon_port_reserve_pin 
    315     #define port_free_pin               amazon_port_free_pin 
    316     #define port_set_altsel0            amazon_port_set_altsel0 
    317     #define port_clear_altsel0          amazon_port_clear_altsel0 
    318     #define port_set_altsel1            amazon_port_set_altsel1 
    319     #define port_clear_altsel1          amazon_port_clear_altsel1 
    320     #define port_set_dir_out            amazon_port_set_dir_out 
    321 #endif  //  defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON 
    322  
    323  
    324 /* 
    325  *  File Operations 
    326  */ 
    327 static int led_ioctl(struct inode *, struct file *, unsigned int, unsigned long); 
    328 static int led_open(struct inode *, struct file *); 
    329 static int led_release(struct inode *, struct file *); 
    330  
    331 /* 
    332  *  Software Update LED 
    333  */ 
    334201static inline int update_led(void); 
    335202 
    336 /* 
    337  *  LED Configuration Functions 
    338  */ 
    339203static inline unsigned int set_update_source(unsigned int, unsigned long, unsigned long); 
    340204static inline unsigned int set_blink_in_batch(unsigned int, unsigned long, unsigned long); 
     
    348212static inline unsigned int set_access_right(unsigned int, unsigned long, unsigned long); 
    349213 
    350 /* 
    351  *  PMU Operation 
    352  */ 
    353214static inline void enable_led(void); 
    354215static inline void disable_led(void); 
    355216 
    356 /* 
    357  *  GPIO Setup & Release 
    358  */ 
    359217static inline int setup_gpio_port(unsigned long); 
    360218static inline void release_gpio_port(unsigned long); 
    361219 
    362 /* 
    363  *  GPT Setup & Release 
    364  */ 
    365220static inline int setup_gpt(int, unsigned long); 
    366221static inline void release_gpt(int); 
    367222 
    368 /* 
    369  *  Turn On/Off LED 
    370  */ 
    371223static inline int turn_on_led(unsigned long); 
    372224static inline void turn_off_led(unsigned long); 
     
    375227static struct semaphore led_sem; 
    376228 
    377 static struct file_operations led_fops = { 
    378     owner:      THIS_MODULE, 
    379     ioctl:      led_ioctl, 
    380     open:       led_open, 
    381     release:    led_release 
    382 }; 
    383  
    384 static struct miscdevice led_miscdev = { 
    385     LED_MINOR, 
    386     "led", 
    387     &led_fops, 
    388     NULL, 
    389     NULL, 
    390     NULL 
    391 }; 
    392  
    393229static unsigned long gpt_on = 0; 
    394230static unsigned long gpt_freq = 0; 
     
    399235static int module_id; 
    400236 
    401  
    402 static int 
    403 led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 
    404 { 
    405     int ret = -EINVAL; 
    406     struct led_config_param param; 
    407  
    408     switch ( cmd ) 
    409     { 
    410     case LED_CONFIG: 
    411         copy_from_user(&param, (char*)arg, sizeof(param)); 
    412         ret = danube_led_config(&param); 
    413         break; 
    414     } 
    415  
    416     return ret; 
    417 } 
    418  
    419 static int 
    420 led_open (struct inode *inode, struct file *file) 
    421 { 
    422     return 0; 
    423 } 
    424  
    425 static int 
    426 led_release (struct inode *inode, struct file *file) 
    427 { 
    428     return 0; 
    429 } 
    430237 
    431238static inline int 
     
    437244     *  GPT2 or FPID is the clock to update LEDs automatically. 
    438245     */ 
    439     if ( LED_CON1_US != 0 ) 
     246    if (readl(DANUBE_LED_CON1) >> 30) 
    440247        return 0; 
    441248 
     
    446253    { 
    447254        down(&led_sem); 
    448         if ( !LED_CON0_SWU ) 
     255        if (!(readl(DANUBE_LED_CON0) & LED_CON0_SWU)) 
    449256        { 
    450257            *DANUBE_LED_CON0 |= 1 << 31; 
     
    532339enable_led (void) 
    533340{ 
    534 #if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON 
    535341    /*  Activate LED module in PMU. */ 
    536342    int i = 1000000; 
     
    540346    if ( !i ) 
    541347        panic("Activating LED in PMU failed!"); 
    542 #endif 
    543348} 
    544349 
     
    546351disable_led (void) 
    547352{ 
    548 #if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON 
    549     /*  Inactivating LED module in PMU.    */ 
    550353    *(unsigned long *)0xBF10201C |= 1 << 11; 
    551 #endif 
    552354} 
    553355 
     
    555357setup_gpio_port (unsigned long adsl) 
    556358{ 
    557 #if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON 
    558359    int ret = 0; 
    559  
    560   #if defined(DEBUG_WRITE_REGISTER) && DEBUG_WRITE_REGISTER 
    561     if ( adsl ) 
    562     { 
    563         *(unsigned long *)0xBE100B18 |=  0x30; 
    564         *(unsigned long *)0xBE100B1C |=  0x20; 
    565         *(unsigned long *)0xBE100B1C &= ~0x10; 
    566         *(unsigned long *)0xBE100B20 |=  0x30; 
    567         *(unsigned long *)0xBE100B24 |=  0x30; 
    568     } 
    569     else 
    570     { 
    571         *(unsigned long *)0xBE100B18 |=  0x70; 
    572         *(unsigned long *)0xBE100B1C |=  0x70; 
    573         *(unsigned long *)0xBE100B20 &= ~0x70; 
    574         *(unsigned long *)0xBE100B24 |=  0x70; 
    575     } 
    576   #else 
    577360 
    578361    /* 
     
    636419        LED_SH_OPENDRAIN_SETUP(LED_SH_PORT, LED_SH_PIN, module_id); 
    637420    } 
    638   #endif 
    639 #endif 
    640421 
    641422    return 0; 
     
    645426release_gpio_port (unsigned long adsl) 
    646427{ 
    647 #if !defined(DEBUG_ON_AMAZON) || !DEBUG_ON_AMAZON 
    648   #if !defined(DEBUG_WRITE_REGISTER) || !DEBUG_WRITE_REGISTER 
    649428    if ( adsl ) 
    650429    { 
     
    658437        port_free_pin(LED_SH_PORT, LED_SH_PIN, module_id); 
    659438    } 
    660   #endif 
    661 #endif 
    662439} 
    663440 
     
    736513    up(&led_sem); 
    737514 
    738     return (led == 0 && LED_CON0_AD0) || (led == 1 && LED_CON0_AD1) ? -EINVAL : 0; 
     515    return (led == 0 && (readl(DANUBE_LED_CON0) & LED_CON0_AD0)) || (led == 1 && (readl(DANUBE_LED_CON0) & LED_CON0_AD1)) ? -EINVAL : 0; 
    739516} 
    740517 
     
    787564    f_setup_gpt2 = 0; 
    788565 
    789     f_software_update = LED_CON0_SWU ? 0 : 1; 
     566    f_software_update = (readl(DANUBE_LED_CON0) & LED_CON0_SWU) ? 0 : 1; 
    790567 
    791568    new_led_on = f_led_on; 
     
    969746        disable_led(); 
    970747 
    971 #if defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON 
    972     *DANUBE_LED_CON0 &= 0x7FFFFFFF; 
    973 #endif 
    974  
    975748    up(&led_sem); 
    976749    return 0; 
     
    988761} 
    989762 
     763static int 
     764led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 
     765{ 
     766    int ret = -EINVAL; 
     767    struct led_config_param param; 
     768 
     769    switch ( cmd ) 
     770    { 
     771    case LED_CONFIG: 
     772        copy_from_user(&param, (char*)arg, sizeof(param)); 
     773        ret = danube_led_config(&param); 
     774        break; 
     775    } 
     776 
     777    return ret; 
     778} 
     779 
     780static int 
     781led_open (struct inode *inode, struct file *file) 
     782{ 
     783    return 0; 
     784} 
     785 
     786static int 
     787led_release (struct inode *inode, struct file *file) 
     788{ 
     789    return 0; 
     790} 
     791 
     792static struct file_operations led_fops = { 
     793    owner:      THIS_MODULE, 
     794    ioctl:      led_ioctl, 
     795    open:       led_open, 
     796    release:    led_release 
     797}; 
     798 
     799static struct miscdevice led_miscdev = { 
     800    151, 
     801    "led", 
     802    &led_fops, 
     803    NULL, 
     804    NULL, 
     805    NULL 
     806}; 
    990807 
    991808int __init 
     
    1000817     *  Set default value to registers to turn off all LED light. 
    1001818     */ 
    1002     *DANUBE_LED_AR   = LED_AR_DEFAULT_VALUE; 
    1003     *DANUBE_LED_CPU0 = LED_LED_CPU0_DEFAULT_VALUE; 
    1004     *DANUBE_LED_CPU1 = LED_LED_CPU1_DEFAULT_VALUE; 
    1005     *DANUBE_LED_CON1 = LED_CON1_DEFAULT_VALUE; 
    1006     *DANUBE_LED_CON0 = LED_CON0_DEFAULT_VALUE; 
    1007  
    1008 #if defined(DEBUG_ON_AMAZON) && DEBUG_ON_AMAZON 
    1009     *DANUBE_LED_CON0 &= 0x7FFFFFFF; 
    1010 #endif 
     819    *DANUBE_LED_AR   = 0x0; 
     820    *DANUBE_LED_CPU0 = 0x0; 
     821    *DANUBE_LED_CPU1 = 0x0; 
     822    *DANUBE_LED_CON1 = 0x0; 
     823    *DANUBE_LED_CON0 = (0x80000000 | (DATA_CLOCKING_EDGE << 26)); 
    1011824 
    1012825    disable_led(); 
     
    1032845    up(&led_sem); 
    1033846 
    1034 #if BOARD_TYPE == REFERENCE_BOARD 
    1035847    /*  Add to enable hardware relay    */ 
    1036848        /*  Map for LED on reference board 
     
    1056868    param.data = 1 << 4; 
    1057869    danube_led_config(&param); 
    1058 #endif 
    1059870 
    1060871    //  by default, update by FSC clock (FPID) 
  • trunk/target/linux/danube/files/include/asm-mips/danube/danube.h

    r9727 r9733  
    305305#define DANUBE_BIU_WDT_CR_RELOAD_SET(value)     (((( 1 << 16) - 1) & (value)) << 0) 
    306306 
     307 
     308/*------------ LED */ 
     309 
     310#define DANUBE_LED_BASE_ADDR    (KSEG1 + 0x1E100BB0) 
     311#define DANUBE_LED_CON0                 ((u32*)(DANUBE_LED_BASE_ADDR + 0x0000)) 
     312#define DANUBE_LED_CON1                 ((u32*)(DANUBE_LED_BASE_ADDR + 0x0004)) 
     313#define DANUBE_LED_CPU0                 ((u32*)(DANUBE_LED_BASE_ADDR + 0x0008)) 
     314#define DANUBE_LED_CPU1                 ((u32*)(DANUBE_LED_BASE_ADDR + 0x000C)) 
     315#define DANUBE_LED_AR                   ((u32*)(DANUBE_LED_BASE_ADDR + 0x0010)) 
     316 
     317 
     318#define LED_CON0_SWU                    (1 << 31) 
     319#define LED_CON0_AD1                    (1 << 25) 
     320#define LED_CON0_AD0                    (1 << 24) 
     321 
    307322#endif 
Note: See TracChangeset for help on using the changeset viewer.