more danube 2 ifxmips transitions
[openwrt.git] / target / linux / danube / files / drivers / char / danube_led.c
index 8f57589..86a92d5 100644 (file)
 #include <linux/version.h>
 #include <linux/types.h>
 #include <linux/fs.h>
-#include <linux/miscdevice.h>
 #include <linux/init.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
 #include <linux/errno.h>
 #include <asm/danube/danube.h>
 #include <asm/danube/danube_gpio.h>
+#include <asm/danube/danube_pmu.h>
 
-#define LED_CONFIG                      0x01
+#define DANUBE_LED_CLK_EDGE                            DANUBE_LED_FALLING
+//#define DANUBE_LED_CLK_EDGE                  DANUBE_LED_RISING
 
-#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
+#define DANUBE_LED_SPEED                               DANUBE_LED_8HZ
 
-#define DANUBE_LED_CLK_EDGE                            DANUBE_LED_FALLING
-//#define DANUBE_LED_CLK_EDGE                          DANUBE_LED_RISING
-
-#define LED_SH_PORT                     0
-#define LED_SH_PIN                      4
-#define LED_SH_DIR                      1
-#define LED_SH_ALTSEL0                  1
-#define LED_SH_ALTSEL1                  0
-#define LED_SH_OPENDRAIN                1
-#define LED_D_PORT                      0
-#define LED_D_PIN                       5
-#define LED_D_DIR                       1
-#define LED_D_ALTSEL0                   1
-#define LED_D_ALTSEL1                   0
-#define LED_D_OPENDRAIN                 1
-#define LED_ST_PORT                     0
-#define LED_ST_PIN                      6
-#define LED_ST_DIR                      1
-#define LED_ST_ALTSEL0                  1
-#define LED_ST_ALTSEL1                  0
-#define LED_ST_OPENDRAIN                1
-
-#define LED_ADSL0_PORT                  0
-#define LED_ADSL0_PIN                   4
-#define LED_ADSL0_DIR                   1
-#define LED_ADSL0_ALTSEL0               0
-#define LED_ADSL0_ALTSEL1               1
-#define LED_ADSL0_OPENDRAIN             1
-#define LED_ADSL1_PORT                  0
-#define LED_ADSL1_PIN                   5
-#define LED_ADSL1_DIR                   1
-#define LED_ADSL1_ALTSEL0               1
-#define LED_ADSL1_ALTSEL1               1
-#define LED_ADSL1_OPENDRAIN             1
-
-#if (LED_SH_PORT == LED_ADSL0_PORT && LED_SH_PIN == LED_ADSL0_PIN)      \
-    || (LED_D_PORT == LED_ADSL0_PORT && LED_D_PIN == LED_ADSL0_PIN)     \
-    || (LED_ST_PORT == LED_ADSL0_PORT && LED_ST_PIN == LED_ADSL0_PIN)   \
-    || (LED_SH_PORT == LED_ADSL1_PORT && LED_SH_PIN == LED_ADSL1_PIN)   \
-    || (LED_D_PORT == LED_ADSL1_PORT && LED_D_PIN == LED_ADSL1_PIN)     \
-    || (LED_ST_PORT == LED_ADSL1_PORT && LED_ST_PIN == LED_ADSL1_PIN)
-  #define ADSL_LED_IS_EXCLUSIVE         1
-#else
-  #define ADSL_LED_IS_EXCLUSIVE         0
-#endif
-
-#if LED_SH_DIR
-  #define LED_SH_DIR_SETUP              danube_port_set_dir_out
-#else
-  #define LED_SH_DIR_SETUP              danube_port_clear_dir_out
-#endif
-#if LED_SH_ALTSEL0
-  #define LED_SH_ALTSEL0_SETUP          danube_port_set_altsel0
-#else
-  #define LED_SH_ALTSEL0_SETUP          danube_port_clear_altsel0
-#endif
-#if LED_SH_ALTSEL1
-  #define LED_SH_ALTSEL1_SETUP          danube_port_set_altsel1
-#else
-  #define LED_SH_ALTSEL1_SETUP          danube_port_clear_altsel1
-#endif
-#if LED_SH_OPENDRAIN
-  #define LED_SH_OPENDRAIN_SETUP        danube_port_set_open_drain
-#else
-  #define LED_SH_OPENDRAIN_SETUP        danube_port_clear_open_drain
-#endif
-
-#if LED_D_DIR
-  #define LED_D_DIR_SETUP               danube_port_set_dir_out
-#else
-  #define LED_D_DIR_SETUP               danube_port_clear_dir_out
-#endif
-#if LED_D_ALTSEL0
-  #define LED_D_ALTSEL0_SETUP           danube_port_set_altsel0
-#else
-  #define LED_D_ALTSEL0_SETUP           danube_port_clear_altsel0
-#endif
-#if LED_D_ALTSEL1
-  #define LED_D_ALTSEL1_SETUP           danube_port_set_altsel1
-#else
-  #define LED_D_ALTSEL1_SETUP           danube_port_clear_altsel1
-#endif
-#if LED_D_OPENDRAIN
-  #define LED_D_OPENDRAIN_SETUP         danube_port_set_open_drain
-#else
-  #define LED_D_OPENDRAIN_SETUP         danube_port_clear_open_drain
-#endif
-
-#if LED_ST_DIR
-  #define LED_ST_DIR_SETUP              danube_port_set_dir_out
-#else
-  #define LED_ST_DIR_SETUP              danube_port_clear_dir_out
-#endif
-#if LED_ST_ALTSEL0
-  #define LED_ST_ALTSEL0_SETUP          danube_port_set_altsel0
-#else
-  #define LED_ST_ALTSEL0_SETUP          danube_port_clear_altsel0
-#endif
-#if LED_ST_ALTSEL1
-  #define LED_ST_ALTSEL1_SETUP          danube_port_set_altsel1
-#else
-  #define LED_ST_ALTSEL1_SETUP          danube_port_clear_altsel1
-#endif
-#if LED_ST_OPENDRAIN
-  #define LED_ST_OPENDRAIN_SETUP        danube_port_set_open_drain
-#else
-  #define LED_ST_OPENDRAIN_SETUP        danube_port_clear_open_drain
-#endif
-
-#if LED_ADSL0_DIR
-  #define LED_ADSL0_DIR_SETUP           danube_port_set_dir_out
-#else
-  #define LED_ADSL0_DIR_SETUP           danube_port_clear_dir_out
-#endif
-#if LED_ADSL0_ALTSEL0
-  #define LED_ADSL0_ALTSEL0_SETUP       danube_port_set_altsel0
-#else
-  #define LED_ADSL0_ALTSEL0_SETUP       danube_port_clear_altsel0
-#endif
-#if LED_ADSL0_ALTSEL1
-  #define LED_ADSL0_ALTSEL1_SETUP       danube_port_set_altsel1
-#else
-  #define LED_ADSL0_ALTSEL1_SETUP       danube_port_clear_altsel1
-#endif
-#if LED_ADSL0_OPENDRAIN
-  #define LED_ADSL0_OPENDRAIN_SETUP     danube_port_set_open_drain
-#else
-  #define LED_ADSL0_OPENDRAIN_SETUP     danube_port_clear_open_drain
-#endif
-
-#if LED_ADSL1_DIR
-  #define LED_ADSL1_DIR_SETUP           danube_port_set_dir_out
-#else
-  #define LED_ADSL1_DIR_SETUP           danube_port_clear_dir_out
-#endif
-#if LED_ADSL1_ALTSEL0
-  #define LED_ADSL1_ALTSEL0_SETUP       danube_port_set_altsel0
-#else
-  #define LED_ADSL1_ALTSEL0_SETUP       danube_port_clear_altsel0
-#endif
-#if LED_ADSL1_ALTSEL1
-  #define LED_ADSL1_ALTSEL1_SETUP       danube_port_set_altsel1
-#else
-  #define LED_ADSL1_ALTSEL1_SETUP       danube_port_clear_altsel1
-#endif
-#if LED_ADSL1_OPENDRAIN
-  #define LED_ADSL1_OPENDRAIN_SETUP     danube_port_set_open_drain
-#else
-  #define LED_ADSL1_OPENDRAIN_SETUP     danube_port_clear_open_drain
-#endif
-
-#define SET_BITS(x, msb, lsb, value)    (((x) & ~(((1 << ((msb) + 1)) - 1) ^ ((1 << (lsb)) - 1))) | (((value) & ((1 << (1 + (msb) - (lsb))) - 1)) << (lsb)))
+#define DANUBE_LED_GPIO_PORT   0
 
 static int danube_led_major;
 
-static int
-danube_led_setup_gpio (void)
+void
+danube_led_set (unsigned int led)
 {
-       /*
-       *  Set LED_ST
-       *    I don't check the return value, because I'm sure the value is valid
-       *    and the pins are reserved already.
-       */
-       LED_ST_ALTSEL0_SETUP(LED_ST_PORT, LED_ST_PIN);
-       LED_ST_ALTSEL1_SETUP(LED_ST_PORT, LED_ST_PIN);
-       LED_ST_DIR_SETUP(LED_ST_PORT, LED_ST_PIN);
-       LED_ST_OPENDRAIN_SETUP(LED_ST_PORT, LED_ST_PIN);
-
-       /*
-       *  Set LED_D
-       */
-       LED_D_ALTSEL0_SETUP(LED_D_PORT, LED_D_PIN);
-       LED_D_ALTSEL1_SETUP(LED_D_PORT, LED_D_PIN);
-       LED_D_DIR_SETUP(LED_D_PORT, LED_D_PIN);
-       LED_D_OPENDRAIN_SETUP(LED_D_PORT, LED_D_PIN);
-
-       /*
-       *  Set LED_SH
-       */
-       LED_SH_ALTSEL0_SETUP(LED_SH_PORT, LED_SH_PIN);
-       LED_SH_ALTSEL1_SETUP(LED_SH_PORT, LED_SH_PIN);
-       LED_SH_DIR_SETUP(LED_SH_PORT, LED_SH_PIN);
-       LED_SH_OPENDRAIN_SETUP(LED_SH_PORT, LED_SH_PIN);
-
-       return 0;
+       led &= 0xffffff;
+       writel(readl(DANUBE_LED_CPU0) | led, DANUBE_LED_CPU0);
 }
+EXPORT_SYMBOL(danube_led_set);
 
-static void
-danube_led_enable (void)
+void
+danube_led_clear (unsigned int led)
 {
-       int err = 1000000;
+       led = ~(led & 0xffffff);
+       writel(readl(DANUBE_LED_CPU0) & led, DANUBE_LED_CPU0);
+}
+EXPORT_SYMBOL(danube_led_clear);
 
-       writel(readl(DANUBE_PMU_PWDCR) & ~DANUBE_PMU_PWDCR_LED, DANUBE_PMU_PWDCR);
-       while (--err && (readl(DANUBE_PMU_PWDSR) & DANUBE_PMU_PWDCR_LED)) {}
+void
+danube_led_blink_set (unsigned int led)
+{
+       led &= 0xffffff;
+       writel(readl(DANUBE_LED_CON0) | led, DANUBE_LED_CON0);
+}
+EXPORT_SYMBOL(danube_led_blink_set);
 
-       if (!err)
-               panic("Activating LED in PMU failed!");
+void
+danube_led_blink_clear (unsigned int led)
+{
+       led = ~(led & 0xffffff);
+       writel(readl(DANUBE_LED_CON0) & led, DANUBE_LED_CON0);
 }
+EXPORT_SYMBOL(danube_led_blink_clear);
 
-static inline void
-danube_led_disable (void)
+void
+danube_led_setup_gpio (void)
 {
-       writel(readl(DANUBE_PMU_PWDCR) | DANUBE_PMU_PWDCR_LED, DANUBE_PMU_PWDCR);
+       int i = 0;
+
+       /* we need to setup pins SH,D,ST (4,5,6) */
+       for (i = 4; i < 7; i++)
+       {
+               danube_port_set_altsel0(DANUBE_LED_GPIO_PORT, i);
+               danube_port_clear_altsel1(DANUBE_LED_GPIO_PORT, i);
+               danube_port_set_dir_out(DANUBE_LED_GPIO_PORT, i);
+               danube_port_set_open_drain(DANUBE_LED_GPIO_PORT, i);
+       }
 }
 
 static int
@@ -256,8 +94,6 @@ led_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned lo
 
        switch ( cmd )
        {
-       case LED_CONFIG:
-               break;
        }
 
        return ret;
@@ -309,9 +145,10 @@ danube_led_init (void)
        danube_led_setup_gpio();
 
        writel(0, DANUBE_LED_AR);
-       writel(0xff00, DANUBE_LED_CPU0);
+       writel(0, DANUBE_LED_CPU0);
        writel(0, DANUBE_LED_CPU1);
-       writel(0x8000ffff, DANUBE_LED_CON0);
+       writel(LED_CON0_SWU, DANUBE_LED_CON0);
+       writel(0, DANUBE_LED_CON1);
 
        /* setup the clock edge that the shift register is triggered on */
        writel(readl(DANUBE_LED_CON0) & ~DANUBE_LED_EDGE_MASK, DANUBE_LED_CON0);
@@ -326,13 +163,13 @@ danube_led_init (void)
 
        /* set led update speed */
        writel(readl(DANUBE_LED_CON1) & ~DANUBE_LED_MASK, DANUBE_LED_CON1);
-       writel(readl(DANUBE_LED_CON1) | DANUBE_LED_8HZ, DANUBE_LED_CON1);
+       writel(readl(DANUBE_LED_CON1) | DANUBE_LED_SPEED, DANUBE_LED_CON1);
 
        /* adsl 0 and 1 leds are updated by the arc */
        writel(readl(DANUBE_LED_CON0) | DANUBE_LED_ADSL_SRC, DANUBE_LED_CON0);
 
        /* per default, the leds are turned on */
-       danube_led_enable();
+       danube_pmu_enable(DANUBE_PMU_PWDCR_LED);
 
        danube_led_major = register_chrdev(0, "danube_led", &danube_led_fops);
 
This page took 0.029855 seconds and 4 git commands to generate.