brcm63xx: add upstream LED drivers
authorÁlvaro Fernández Rojas <noltari@gmail.com>
Sat, 27 Feb 2016 12:49:39 +0000 (13:49 +0100)
committerÁlvaro Fernández Rojas <noltari@gmail.com>
Tue, 2 Aug 2016 16:11:59 +0000 (18:11 +0200)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
13 files changed:
target/linux/brcm63xx/config-4.4
target/linux/brcm63xx/patches-4.4/010-01-leds-bcm6328-Reuse-bcm6328_led_set-instead-of-copyin.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-02-leds-bcm6328-Swap-LED-ON-and-OFF-definitions.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-03-leds-bcm6328-code-cleaning.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-04-leds-bcm6328-remove-unneded-lock-when-checking-initi.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-05-leds-bcm6358-Use-bcm6358_led_set-in-order-to-get-rid.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-06-leds-bcm6358-remove-unneded-lock-when-checking-initi.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-07-leds-bcm6328-add-little-endian-support.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-08-leds-bcm6358-add-little-endian-support.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-09-leds-bcm6328-simplify-duplicated-unlock-in-bcm6328_b.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-10-leds-bcm6358-merge-bcm6358_led_mode-and-bcm6358_led_.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-11-leds-bcm6328-improve-blink-support.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-4.4/010-12-leds-bcm6358-remove-unneeded-busy-status-check.patch [new file with mode: 0644]

index fb448adc1aae51ec71f2fba7eacf414c8d4c9d9c..f7a92ac4a56e5815c9272875fe1dd65f8381765d 100644 (file)
@@ -143,6 +143,8 @@ CONFIG_IRQ_MIPS_CPU=y
 CONFIG_IRQ_WORK=y
 CONFIG_KEXEC=y
 CONFIG_KEXEC_CORE=y
+CONFIG_LEDS_BCM6328=y
+CONFIG_LEDS_BCM6358=y
 CONFIG_LEDS_GPIO=y
 CONFIG_LIBFDT=y
 CONFIG_MDIO_BOARDINFO=y
diff --git a/target/linux/brcm63xx/patches-4.4/010-01-leds-bcm6328-Reuse-bcm6328_led_set-instead-of-copyin.patch b/target/linux/brcm63xx/patches-4.4/010-01-leds-bcm6328-Reuse-bcm6328_led_set-instead-of-copyin.patch
new file mode 100644 (file)
index 0000000..9d547d2
--- /dev/null
@@ -0,0 +1,39 @@
+From a3fac1cea8aa51782e788170818b0937e752b4e8 Mon Sep 17 00:00:00 2001
+From: Simon Arlott <simon@fire.lp0.eu>
+Date: Mon, 16 Nov 2015 20:24:59 +0000
+Subject: [PATCH] leds: bcm6328: Reuse bcm6328_led_set() instead of copying its
+ functionality
+
+When ensuring a consistent initial LED state in bcm6328_led (as they may
+be blinking instead of on/off), the LED register is set using an inverted
+copy of bcm6328_led_set(). To avoid further errors relating to active low
+handling, call this function directly instead.
+
+As bcm6328_led_set() acquires the same spinlock again when updating the
+register, it is called after unlocking.
+
+Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -314,14 +314,10 @@ static int bcm6328_led(struct device *de
+       } else {
+               led->cdev.brightness = LED_OFF;
+       }
+-
+-      if ((led->active_low && led->cdev.brightness == LED_FULL) ||
+-          (!led->active_low && led->cdev.brightness == LED_OFF))
+-              bcm6328_led_mode(led, BCM6328_LED_MODE_ON);
+-      else
+-              bcm6328_led_mode(led, BCM6328_LED_MODE_OFF);
+       spin_unlock_irqrestore(lock, flags);
++      bcm6328_led_set(&led->cdev, led->cdev.brightness);
++
+       led->cdev.brightness_set = bcm6328_led_set;
+       led->cdev.blink_set = bcm6328_blink_set;
diff --git a/target/linux/brcm63xx/patches-4.4/010-02-leds-bcm6328-Swap-LED-ON-and-OFF-definitions.patch b/target/linux/brcm63xx/patches-4.4/010-02-leds-bcm6328-Swap-LED-ON-and-OFF-definitions.patch
new file mode 100644 (file)
index 0000000..afee7b4
--- /dev/null
@@ -0,0 +1,53 @@
+From 37555e92b4693d8bd96cb5131d1b621941ec3ab6 Mon Sep 17 00:00:00 2001
+From: Simon Arlott <simon@fire.lp0.eu>
+Date: Sun, 15 Nov 2015 13:34:37 +0000
+Subject: [PATCH] leds: bcm6328: Swap LED ON and OFF definitions
+
+The values of BCM6328_LED_MODE_ON and BCM6328_LED_MODE_OFF were named
+for active low LEDs. These should be swapped so that they are named for
+the default case of active high LEDs.
+
+Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -48,10 +48,10 @@
+                                        BCM6328_SERIAL_LED_SHIFT_DIR)
+ #define BCM6328_LED_MODE_MASK         3
+-#define BCM6328_LED_MODE_OFF          0
++#define BCM6328_LED_MODE_ON           0
+ #define BCM6328_LED_MODE_FAST         1
+ #define BCM6328_LED_MODE_BLINK                2
+-#define BCM6328_LED_MODE_ON           3
++#define BCM6328_LED_MODE_OFF          3
+ #define BCM6328_LED_SHIFT(X)          ((X) << 1)
+ /**
+@@ -126,9 +126,9 @@ static void bcm6328_led_set(struct led_c
+       *(led->blink_leds) &= ~BIT(led->pin);
+       if ((led->active_low && value == LED_OFF) ||
+           (!led->active_low && value != LED_OFF))
+-              bcm6328_led_mode(led, BCM6328_LED_MODE_OFF);
+-      else
+               bcm6328_led_mode(led, BCM6328_LED_MODE_ON);
++      else
++              bcm6328_led_mode(led, BCM6328_LED_MODE_OFF);
+       spin_unlock_irqrestore(led->lock, flags);
+ }
+@@ -303,8 +303,8 @@ static int bcm6328_led(struct device *de
+                       val = bcm6328_led_read(mode) >>
+                             BCM6328_LED_SHIFT(shift % 16);
+                       val &= BCM6328_LED_MODE_MASK;
+-                      if ((led->active_low && val == BCM6328_LED_MODE_ON) ||
+-                          (!led->active_low && val == BCM6328_LED_MODE_OFF))
++                      if ((led->active_low && val == BCM6328_LED_MODE_OFF) ||
++                          (!led->active_low && val == BCM6328_LED_MODE_ON))
+                               led->cdev.brightness = LED_FULL;
+                       else
+                               led->cdev.brightness = LED_OFF;
diff --git a/target/linux/brcm63xx/patches-4.4/010-03-leds-bcm6328-code-cleaning.patch b/target/linux/brcm63xx/patches-4.4/010-03-leds-bcm6328-code-cleaning.patch
new file mode 100644 (file)
index 0000000..2dad5dd
--- /dev/null
@@ -0,0 +1,50 @@
+From 486ead409ac7f0bcf3f4194c299691118eb3cb3c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:45 +0100
+Subject: [PATCH] leds: bcm6328: code cleaning
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+- Remove double whitespace
+- Add missing brackets
+- Add spinlock info
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -42,7 +42,7 @@
+ #define BCM6328_LED_SHIFT_TEST                BIT(30)
+ #define BCM6328_LED_TEST              BIT(31)
+ #define BCM6328_INIT_MASK             (BCM6328_SERIAL_LED_EN | \
+-                                       BCM6328_SERIAL_LED_MUX  | \
++                                       BCM6328_SERIAL_LED_MUX | \
+                                        BCM6328_SERIAL_LED_CLK_NPOL | \
+                                        BCM6328_SERIAL_LED_DATA_PPOL | \
+                                        BCM6328_SERIAL_LED_SHIFT_DIR)
+@@ -151,9 +151,9 @@ static int bcm6328_blink_set(struct led_
+       }
+       delay = *delay_on / BCM6328_LED_INTERVAL_MS;
+-      if (delay == 0)
++      if (delay == 0) {
+               delay = 1;
+-      else if (delay > BCM6328_LED_INTV_MASK) {
++      } else if (delay > BCM6328_LED_INTV_MASK) {
+               dev_dbg(led_cdev->dev,
+                       "fallback to soft blinking (delay > %ums)\n",
+                       BCM6328_LED_INTV_MASK * BCM6328_LED_INTERVAL_MS);
+@@ -337,7 +337,7 @@ static int bcm6328_leds_probe(struct pla
+       struct device_node *child;
+       struct resource *mem_r;
+       void __iomem *mem;
+-      spinlock_t *lock;
++      spinlock_t *lock; /* memory lock */
+       unsigned long val, *blink_leds, *blink_delay;
+       mem_r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
diff --git a/target/linux/brcm63xx/patches-4.4/010-04-leds-bcm6328-remove-unneded-lock-when-checking-initi.patch b/target/linux/brcm63xx/patches-4.4/010-04-leds-bcm6328-remove-unneded-lock-when-checking-initi.patch
new file mode 100644 (file)
index 0000000..847e51d
--- /dev/null
@@ -0,0 +1,43 @@
+From 535d28f143e4eadb8f675885f29f7564dce5acab Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:46 +0100
+Subject: [PATCH] leds: bcm6328: remove unneded lock when checking initial LED
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This lock isn't really needed, since we're only reading the register and
+changes made to other LEDs aren't relevant.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -264,7 +264,6 @@ static int bcm6328_led(struct device *de
+                      unsigned long *blink_leds, unsigned long *blink_delay)
+ {
+       struct bcm6328_led *led;
+-      unsigned long flags;
+       const char *state;
+       int rc;
+@@ -286,7 +285,6 @@ static int bcm6328_led(struct device *de
+                                                   "linux,default-trigger",
+                                                   NULL);
+-      spin_lock_irqsave(lock, flags);
+       if (!of_property_read_string(nc, "default-state", &state)) {
+               if (!strcmp(state, "on")) {
+                       led->cdev.brightness = LED_FULL;
+@@ -314,7 +312,6 @@ static int bcm6328_led(struct device *de
+       } else {
+               led->cdev.brightness = LED_OFF;
+       }
+-      spin_unlock_irqrestore(lock, flags);
+       bcm6328_led_set(&led->cdev, led->cdev.brightness);
diff --git a/target/linux/brcm63xx/patches-4.4/010-05-leds-bcm6358-Use-bcm6358_led_set-in-order-to-get-rid.patch b/target/linux/brcm63xx/patches-4.4/010-05-leds-bcm6358-Use-bcm6358_led_set-in-order-to-get-rid.patch
new file mode 100644 (file)
index 0000000..4fca2e5
--- /dev/null
@@ -0,0 +1,32 @@
+From 240d3bc917249c27fd45b081c1948bd0fff88389 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:47 +0100
+Subject: [PATCH] leds: bcm6358: Use bcm6358_led_set() in order to get rid of
+ the lock
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Replaces bcm6358_led_mode with bcm6358_led_set so we don't need to handle
+the lock.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6358.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/leds/leds-bcm6358.c
++++ b/drivers/leds/leds-bcm6358.c
+@@ -141,9 +141,10 @@ static int bcm6358_led(struct device *de
+       } else {
+               led->cdev.brightness = LED_OFF;
+       }
+-      bcm6358_led_mode(led, led->cdev.brightness);
+       spin_unlock_irqrestore(lock, flags);
++      bcm6358_led_set(&led->cdev, led->cdev.brightness);
++
+       led->cdev.brightness_set = bcm6358_led_set;
+       rc = led_classdev_register(dev, &led->cdev);
diff --git a/target/linux/brcm63xx/patches-4.4/010-06-leds-bcm6358-remove-unneded-lock-when-checking-initi.patch b/target/linux/brcm63xx/patches-4.4/010-06-leds-bcm6358-remove-unneded-lock-when-checking-initi.patch
new file mode 100644 (file)
index 0000000..528a95b
--- /dev/null
@@ -0,0 +1,44 @@
+From a43fde32adcb39be4ee33c2f57c3ad5e2e750fbc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:48 +0100
+Subject: [PATCH] leds: bcm6358: remove unneded lock when checking initial LED
+ status
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This lock isn't really needed, since we're only reading the register and
+changes made to other LEDs aren't relevant.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6358.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/leds/leds-bcm6358.c
++++ b/drivers/leds/leds-bcm6358.c
+@@ -99,7 +99,6 @@ static int bcm6358_led(struct device *de
+                      void __iomem *mem, spinlock_t *lock)
+ {
+       struct bcm6358_led *led;
+-      unsigned long flags;
+       const char *state;
+       int rc;
+@@ -119,7 +118,6 @@ static int bcm6358_led(struct device *de
+                                                   "linux,default-trigger",
+                                                   NULL);
+-      spin_lock_irqsave(lock, flags);
+       if (!of_property_read_string(nc, "default-state", &state)) {
+               if (!strcmp(state, "on")) {
+                       led->cdev.brightness = LED_FULL;
+@@ -141,7 +139,6 @@ static int bcm6358_led(struct device *de
+       } else {
+               led->cdev.brightness = LED_OFF;
+       }
+-      spin_unlock_irqrestore(lock, flags);
+       bcm6358_led_set(&led->cdev, led->cdev.brightness);
diff --git a/target/linux/brcm63xx/patches-4.4/010-07-leds-bcm6328-add-little-endian-support.patch b/target/linux/brcm63xx/patches-4.4/010-07-leds-bcm6328-add-little-endian-support.patch
new file mode 100644 (file)
index 0000000..043f95c
--- /dev/null
@@ -0,0 +1,39 @@
+From 4dac45ffbd2a58d7d74b9a07954c5b96108abf19 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:49 +0100
+Subject: [PATCH] leds: bcm6328: add little endian support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This adds little endian support while keeping big endian support.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -76,12 +76,20 @@ struct bcm6328_led {
+ static void bcm6328_led_write(void __iomem *reg, unsigned long data)
+ {
++#ifdef CONFIG_CPU_BIG_ENDIAN
+       iowrite32be(data, reg);
++#else
++      writel(data, reg);
++#endif
+ }
+ static unsigned long bcm6328_led_read(void __iomem *reg)
+ {
++#ifdef CONFIG_CPU_BIG_ENDIAN
+       return ioread32be(reg);
++#else
++      return readl(reg);
++#endif
+ }
+ /**
diff --git a/target/linux/brcm63xx/patches-4.4/010-08-leds-bcm6358-add-little-endian-support.patch b/target/linux/brcm63xx/patches-4.4/010-08-leds-bcm6358-add-little-endian-support.patch
new file mode 100644 (file)
index 0000000..a2d06ce
--- /dev/null
@@ -0,0 +1,39 @@
+From 9cadc2eff18c892bf8d11ac8115cbc1aa1172175 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:50 +0100
+Subject: [PATCH] leds: bcm6358: add little endian support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This adds little endian support while keeping big endian support.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6358.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/drivers/leds/leds-bcm6358.c
++++ b/drivers/leds/leds-bcm6358.c
+@@ -49,12 +49,20 @@ struct bcm6358_led {
+ static void bcm6358_led_write(void __iomem *reg, unsigned long data)
+ {
++#ifdef CONFIG_CPU_BIG_ENDIAN
+       iowrite32be(data, reg);
++#else
++      writel(data, reg);
++#endif
+ }
+ static unsigned long bcm6358_led_read(void __iomem *reg)
+ {
++#ifdef CONFIG_CPU_BIG_ENDIAN
+       return ioread32be(reg);
++#else
++      return readl(reg);
++#endif
+ }
+ static unsigned long bcm6358_led_busy(void __iomem *mem)
diff --git a/target/linux/brcm63xx/patches-4.4/010-09-leds-bcm6328-simplify-duplicated-unlock-in-bcm6328_b.patch b/target/linux/brcm63xx/patches-4.4/010-09-leds-bcm6328-simplify-duplicated-unlock-in-bcm6328_b.patch
new file mode 100644 (file)
index 0000000..2c0e9ac
--- /dev/null
@@ -0,0 +1,49 @@
+From 6798b85bb625a0c8dbf12614083f1145ed7ddfd5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:51 +0100
+Subject: [PATCH] leds: bcm6328: simplify duplicated unlock in
+ bcm6328_blink_set
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Instead of duplicating the unlock we can store the return value and use a
+single unlock before returning that value, which simplifies the code.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -146,6 +146,7 @@ static int bcm6328_blink_set(struct led_
+       struct bcm6328_led *led =
+               container_of(led_cdev, struct bcm6328_led, cdev);
+       unsigned long delay, flags;
++      int rc;
+       if (!*delay_on)
+               *delay_on = BCM6328_LED_DEF_DELAY;
+@@ -183,16 +184,15 @@ static int bcm6328_blink_set(struct led_
+               bcm6328_led_write(led->mem + BCM6328_REG_INIT, val);
+               bcm6328_led_mode(led, BCM6328_LED_MODE_BLINK);
+-
+-              spin_unlock_irqrestore(led->lock, flags);
++              rc = 0;
+       } else {
+-              spin_unlock_irqrestore(led->lock, flags);
+               dev_dbg(led_cdev->dev,
+                       "fallback to soft blinking (delay already set)\n");
+-              return -EINVAL;
++              rc = -EINVAL;
+       }
++      spin_unlock_irqrestore(led->lock, flags);
+-      return 0;
++      return rc;
+ }
+ static int bcm6328_hwled(struct device *dev, struct device_node *nc, u32 reg,
diff --git a/target/linux/brcm63xx/patches-4.4/010-10-leds-bcm6358-merge-bcm6358_led_mode-and-bcm6358_led_.patch b/target/linux/brcm63xx/patches-4.4/010-10-leds-bcm6358-merge-bcm6358_led_mode-and-bcm6358_led_.patch
new file mode 100644 (file)
index 0000000..39f0406
--- /dev/null
@@ -0,0 +1,56 @@
+From c48c89866ffa61cc209828f8daa06f4f6380028e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Tue, 15 Dec 2015 21:03:52 +0100
+Subject: [PATCH] leds: bcm6358: merge bcm6358_led_mode and bcm6358_led_set
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+bcm6358_led_mode is now only called by bcm6358_led_set, so merge both
+in one single function.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6358.c | 20 ++++++--------------
+ 1 file changed, 6 insertions(+), 14 deletions(-)
+
+--- a/drivers/leds/leds-bcm6358.c
++++ b/drivers/leds/leds-bcm6358.c
+@@ -76,12 +76,15 @@ static unsigned long bcm6358_led_busy(vo
+       return val;
+ }
+-static void bcm6358_led_mode(struct bcm6358_led *led, unsigned long value)
++static void bcm6358_led_set(struct led_classdev *led_cdev,
++                          enum led_brightness value)
+ {
+-      unsigned long val;
++      struct bcm6358_led *led =
++              container_of(led_cdev, struct bcm6358_led, cdev);
++      unsigned long flags, val;
++      spin_lock_irqsave(led->lock, flags);
+       bcm6358_led_busy(led->mem);
+-
+       val = bcm6358_led_read(led->mem + BCM6358_REG_MODE);
+       if ((led->active_low && value == LED_OFF) ||
+           (!led->active_low && value != LED_OFF))
+@@ -89,17 +92,6 @@ static void bcm6358_led_mode(struct bcm6
+       else
+               val &= ~(BIT(led->pin));
+       bcm6358_led_write(led->mem + BCM6358_REG_MODE, val);
+-}
+-
+-static void bcm6358_led_set(struct led_classdev *led_cdev,
+-                          enum led_brightness value)
+-{
+-      struct bcm6358_led *led =
+-              container_of(led_cdev, struct bcm6358_led, cdev);
+-      unsigned long flags;
+-
+-      spin_lock_irqsave(led->lock, flags);
+-      bcm6358_led_mode(led, value);
+       spin_unlock_irqrestore(led->lock, flags);
+ }
diff --git a/target/linux/brcm63xx/patches-4.4/010-11-leds-bcm6328-improve-blink-support.patch b/target/linux/brcm63xx/patches-4.4/010-11-leds-bcm6328-improve-blink-support.patch
new file mode 100644 (file)
index 0000000..1f8ec3e
--- /dev/null
@@ -0,0 +1,64 @@
+From b5b7aea24c62d8b334520a3aab6e590d2be28e77 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Wed, 16 Dec 2015 21:13:48 +0100
+Subject: [PATCH] leds: bcm6328: improve blink support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+BCM6328 controller has a margin of 20ms per blink step, which means that
+we can only set it to 20, 40, 60 ... 1260 ms (0x3f * 20ms).
+However, when checking if delay_on == delay_off, we were not considering
+the case when the user had set delay_on=20 and delay_off=21, since this
+will cause the driver to fallback to software blinking.
+This update fixes this issue and improves blink steps by rounding them
+in a more sensible way. Now 30-49ms is rounded to 40 ms, and previous
+behaviour implied 40-59ms being rounded to 40 ms.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6328.c | 20 +++++++++++++++-----
+ 1 file changed, 15 insertions(+), 5 deletions(-)
+
+--- a/drivers/leds/leds-bcm6328.c
++++ b/drivers/leds/leds-bcm6328.c
+@@ -140,6 +140,18 @@ static void bcm6328_led_set(struct led_c
+       spin_unlock_irqrestore(led->lock, flags);
+ }
++static unsigned long bcm6328_blink_delay(unsigned long delay)
++{
++      unsigned long bcm6328_delay;
++
++      bcm6328_delay = delay + BCM6328_LED_INTERVAL_MS / 2;
++      bcm6328_delay = bcm6328_delay / BCM6328_LED_INTERVAL_MS;
++      if (bcm6328_delay == 0)
++              bcm6328_delay = 1;
++
++      return bcm6328_delay;
++}
++
+ static int bcm6328_blink_set(struct led_classdev *led_cdev,
+                            unsigned long *delay_on, unsigned long *delay_off)
+ {
+@@ -153,16 +165,14 @@ static int bcm6328_blink_set(struct led_
+       if (!*delay_off)
+               *delay_off = BCM6328_LED_DEF_DELAY;
+-      if (*delay_on != *delay_off) {
++      delay = bcm6328_blink_delay(*delay_on);
++      if (delay != bcm6328_blink_delay(*delay_off)) {
+               dev_dbg(led_cdev->dev,
+                       "fallback to soft blinking (delay_on != delay_off)\n");
+               return -EINVAL;
+       }
+-      delay = *delay_on / BCM6328_LED_INTERVAL_MS;
+-      if (delay == 0) {
+-              delay = 1;
+-      } else if (delay > BCM6328_LED_INTV_MASK) {
++      if (delay > BCM6328_LED_INTV_MASK) {
+               dev_dbg(led_cdev->dev,
+                       "fallback to soft blinking (delay > %ums)\n",
+                       BCM6328_LED_INTV_MASK * BCM6328_LED_INTERVAL_MS);
diff --git a/target/linux/brcm63xx/patches-4.4/010-12-leds-bcm6358-remove-unneeded-busy-status-check.patch b/target/linux/brcm63xx/patches-4.4/010-12-leds-bcm6358-remove-unneeded-busy-status-check.patch
new file mode 100644 (file)
index 0000000..f20b234
--- /dev/null
@@ -0,0 +1,28 @@
+From 376886d44f4cba72c4942aa1ac834ba00f6f222d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Wed, 16 Dec 2015 21:13:49 +0100
+Subject: [PATCH] leds: bcm6358: remove unneeded busy status check
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The busy status checking isn't needed while reading initial LED status.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
+---
+ drivers/leds/leds-bcm6358.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/leds/leds-bcm6358.c
++++ b/drivers/leds/leds-bcm6358.c
+@@ -123,9 +123,6 @@ static int bcm6358_led(struct device *de
+                       led->cdev.brightness = LED_FULL;
+               } else if (!strcmp(state, "keep")) {
+                       unsigned long val;
+-
+-                      bcm6358_led_busy(led->mem);
+-
+                       val = bcm6358_led_read(led->mem + BCM6358_REG_MODE);
+                       val &= BIT(led->pin);
+                       if ((led->active_low && !val) ||