danube led cleanup
[openwrt/openwrt.git] / target / linux / danube / files / drivers / char / danube_led.c
index 1f7dda9a696c5edc1cf5ddde809d33855f5a2d28..ba53abfbf930c680728336904bbfceade19482dc 100644 (file)
 #include <asm/danube/danube_led.h>
 #include <asm/danube/danube_gptu.h>
 
+#define LED_CONFIG                      0x01
+
+#define CONFIG_OPERATION_UPDATE_SOURCE  0x0001
+#define CONFIG_OPERATION_BLINK          0x0002
+#define CONFIG_OPERATION_UPDATE_CLOCK   0x0004
+#define CONFIG_OPERATION_STORE_MODE     0x0008
+#define CONFIG_OPERATION_SHIFT_CLOCK    0x0010
+#define CONFIG_OPERATION_DATA_OFFSET    0x0020
+#define CONFIG_OPERATION_NUMBER_OF_LED  0x0040
+#define CONFIG_OPERATION_DATA           0x0080
+#define CONFIG_OPERATION_MIPS0_ACCESS   0x0100
+#define CONFIG_DATA_CLOCK_EDGE          0x0200
+
+
+/*
+*  Data Type Used to Call ioctl
+*/
+struct led_config_param {
+       unsigned long   operation_mask;         //  Select operations to be performed
+       unsigned long   led;                    //  LED to change update source (LED or ADSL)
+       unsigned long   source;                 //  Corresponding update source (LED or ADSL)
+       unsigned long   blink_mask;             //  LEDs to set blink mode
+       unsigned long   blink;                  //  Set to blink mode or normal mode
+       unsigned long   update_clock;           //  Select the source of update clock
+       unsigned long   fpid;                   //  If FPI is the source of update clock, set the divider
+       //  else if GPT is the source, set the frequency
+       unsigned long   store_mode;             //  Set clock mode or single pulse mode for store signal
+       unsigned long   fpis;                   //  FPI is the source of shift clock, set the divider
+       unsigned long   data_offset;            //  Set cycles to be inserted before data is transmitted
+       unsigned long   number_of_enabled_led;  //  Total number of LED to be enabled
+       unsigned long   data_mask;              //  LEDs to set value
+       unsigned long   data;                   //  Corresponding value
+       unsigned long   mips0_access_mask;      //  LEDs to set access right
+       unsigned long   mips0_access;           //  1: the corresponding data is output from MIPS0, 0: MIPS1
+       unsigned long   f_data_clock_on_rising; //  1: data clock on rising edge, 0: data clock on falling edge
+};
+
+
+extern int danube_led_set_blink(unsigned int, unsigned int);
+extern int danube_led_set_data(unsigned int, unsigned int);
+extern int danube_led_config(struct led_config_param *);
+
 #define DATA_CLOCKING_EDGE              FALLING_EDGE
 #define RISING_EDGE                     0
 #define FALLING_EDGE                    1
@@ -808,37 +850,35 @@ static struct miscdevice led_miscdev = {
 int __init
 danube_led_init (void)
 {
-    int ret;
+    int ret = 0;
     struct led_config_param param = {0};
 
     enable_led();
 
-    /*
-     *  Set default value to registers to turn off all LED light.
-     */
-    *DANUBE_LED_AR   = 0x0;
-    *DANUBE_LED_CPU0 = 0x0;
-    *DANUBE_LED_CPU1 = 0x0;
-    *DANUBE_LED_CON1 = 0x0;
-    *DANUBE_LED_CON0 = (0x80000000 | (DATA_CLOCKING_EDGE << 26));
+    writel(0, DANUBE_LED_AR);
+    writel(0, DANUBE_LED_CPU0);
+    writel(0, DANUBE_LED_CPU1);
+    writel(0, DANUBE_LED_CON1);
+    writel((0x80000000 | (DATA_CLOCKING_EDGE << 26)), DANUBE_LED_CON0);
 
     disable_led();
 
     sema_init(&led_sem, 0);
 
     ret = misc_register(&led_miscdev);
-    if ( ret == -EBUSY )
+    if (ret == -EBUSY)
     {
         led_miscdev.minor = MISC_DYNAMIC_MINOR;
         ret = misc_register(&led_miscdev);
     }
-    if ( ret )
+
+       if (ret)
     {
         printk(KERN_ERR "led: can't misc_register\n");
-        return ret;
-    }
-    else
+        goto out;
+    } else {
         printk(KERN_INFO "led: misc_register on minor = %d\n", led_miscdev.minor);
+       }
 
     module_id = THIS_MODULE ? (int)THIS_MODULE : ((MISC_MAJOR << 8) | led_miscdev.minor);
 
@@ -886,7 +926,8 @@ danube_led_init (void)
     param.data = 1 << 5;
     danube_led_config(&param);
 
-    return 0;
+out:
+    return ret;
 }
 
 void __exit