ARM: integrator: move debug LEDs to syscon LED driver
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 15 Oct 2014 15:33:13 +0000 (17:33 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 13 Nov 2014 09:32:03 +0000 (10:32 +0100)
The Integrator debug block is a simple set of registers, make
it a syscon and register the four LEDs on the Integrator/AP
baseboard as syscon LEDs.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/boot/dts/integrator.dtsi
arch/arm/mach-integrator/leds.c

index 5546630..5d27087 100644 (file)
                        reg = <0x19000000 0x1000>;
                        interrupts = <4>;
                };
+
+               syscon {
+                       /* Debug registers mapped as syscon */
+                       compatible = "syscon";
+                       reg = <0x1a000000 0x10>;
+
+                       led@04.0 {
+                               compatible = "register-bit-led";
+                               offset = <0x04>;
+                               mask = <0x01>;
+                               label = "integrator:green0";
+                               linux,default-trigger = "heartbeat";
+                               default-state = "on";
+                       };
+                       led@04.1 {
+                               compatible = "register-bit-led";
+                               offset = <0x04>;
+                               mask = <0x02>;
+                               label = "integrator:yellow";
+                               default-state = "off";
+                       };
+                       led@04.2 {
+                               compatible = "register-bit-led";
+                               offset = <0x04>;
+                               mask = <0x04>;
+                               label = "integrator:red";
+                               default-state = "off";
+                       };
+                       led@04.3 {
+                               compatible = "register-bit-led";
+                               offset = <0x04>;
+                               mask = <0x08>;
+                               label = "integrator:green1";
+                               default-state = "off";
+                       };
+               };
        };
 };
index f1dcb57..56f2437 100644 (file)
 
 #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
 
-#define ALPHA_REG __io_address(INTEGRATOR_DBG_BASE)
-#define LEDREG (__io_address(INTEGRATOR_DBG_BASE) + INTEGRATOR_DBG_LEDS_OFFSET)
-
 struct integrator_led {
        struct led_classdev     cdev;
-       u8                      mask;
 };
 
 /*
@@ -32,40 +28,9 @@ static const struct {
        const char *name;
        const char *trigger;
 } integrator_leds[] = {
-       { "integrator:green0", "heartbeat", },
-       { "integrator:yellow", },
-       { "integrator:red", },
-       { "integrator:green1", },
        { "integrator:core_module", "cpu0", },
 };
 
-static void integrator_led_set(struct led_classdev *cdev,
-                             enum led_brightness b)
-{
-       struct integrator_led *led = container_of(cdev,
-                                                struct integrator_led, cdev);
-       u32 reg = __raw_readl(LEDREG);
-
-       if (b != LED_OFF)
-               reg |= led->mask;
-       else
-               reg &= ~led->mask;
-
-       while (__raw_readl(ALPHA_REG) & 1)
-               cpu_relax();
-
-       __raw_writel(reg, LEDREG);
-}
-
-static enum led_brightness integrator_led_get(struct led_classdev *cdev)
-{
-       struct integrator_led *led = container_of(cdev,
-                                                struct integrator_led, cdev);
-       u32 reg = __raw_readl(LEDREG);
-
-       return (reg & led->mask) ? LED_FULL : LED_OFF;
-}
-
 static void cm_led_set(struct led_classdev *cdev,
                              enum led_brightness b)
 {
@@ -93,19 +58,10 @@ static int __init integrator_leds_init(void)
                if (!led)
                        break;
 
-
                led->cdev.name = integrator_leds[i].name;
-
-               if (i == 4) { /* Setting for LED in core module */
-                       led->cdev.brightness_set = cm_led_set;
-                       led->cdev.brightness_get = cm_led_get;
-               } else {
-                       led->cdev.brightness_set = integrator_led_set;
-                       led->cdev.brightness_get = integrator_led_get;
-               }
-
+               led->cdev.brightness_set = cm_led_set;
+               led->cdev.brightness_get = cm_led_get;
                led->cdev.default_trigger = integrator_leds[i].trigger;
-               led->mask = BIT(i);
 
                if (led_classdev_register(NULL, &led->cdev) < 0) {
                        kfree(led);