From patchwork Mon Mar 16 16:05:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= X-Patchwork-Id: 450641 X-Patchwork-Delegate: jogo@openwrt.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 940E21400A0 for ; Tue, 17 Mar 2015 03:06:27 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="verification failed; unprotected key" header.d=gmail.com header.i=@gmail.com header.b=nH0CWOfC; dkim-adsp=none (unprotected policy); dkim-atps=neutral Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 6980428A22B; Mon, 16 Mar 2015 17:05:23 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=unavailable version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 85F7E281452 for ; Mon, 16 Mar 2015 17:04:52 +0100 (CET) X-policyd-weight: using cached result; rate: -8.5 Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Mon, 16 Mar 2015 17:04:51 +0100 (CET) Received: by wetk59 with SMTP id k59so41834171wet.3 for ; Mon, 16 Mar 2015 09:05:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=svXrg+qpkLwZx8tGzb1k+I27lDEomVpmoeyHJVdQAkY=; b=nH0CWOfCDxnW51kpOP6CwYMUmT9DRiDN7G4tHshskjg830JauSr2npETonFc32Q8kM T6NJ1oJF6v6fR6EBBSuIECvjt8HRdbfzCnmgK8cadUhbQCHNTkWe1CfSAYACmJ9ABHmn gnBcHquf3D2BK3HOmR58U1Oahs6WErxT46zCKC+pkYXzCcb1Z6p2JZGMjUpsVn/7aWr4 qol2wXf+Y846fahT596ZQRa5/YikeXN8Gmmp8ScTG3V3GiXbus8ZvT9/iYIVXVdJEEXH FykjMjz12mTDrot8SgOzPfY7HZKpnrct2dcik8v8taTXiAcRquq5WZ9DFdOa/O5/cVWc KmLA== X-Received: by 10.194.192.104 with SMTP id hf8mr124547182wjc.44.1426521916529; Mon, 16 Mar 2015 09:05:16 -0700 (PDT) Received: from skynet.lan (154.Red-83-46-235.dynamicIP.rima-tde.net. [83.46.235.154]) by mx.google.com with ESMTPSA id vh8sm16010414wjc.12.2015.03.16.09.05.15 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 16 Mar 2015 09:05:15 -0700 (PDT) From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= To: openwrt-devel@lists.openwrt.org, jogo@openwrt.org Date: Mon, 16 Mar 2015 17:05:10 +0100 Message-Id: <1426521911-21626-1-git-send-email-noltari@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1425214407-17809-1-git-send-email-noltari@gmail.com> References: <1425214407-17809-1-git-send-email-noltari@gmail.com> MIME-Version: 1.0 Subject: [OpenWrt-Devel] [PATCH v2 1/2] brcm63xx: add bcm6328 LEDs driver X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" - Adds LEDs driver compatible with 6318/6328/6362/63268 - Set serial LEDs pinmux for 63268 only (6328 and 6362 boards have LEDs on these GPIOs) - Refresh patches Signed-off-by: Álvaro Fernández Rojas --- target/linux/brcm63xx/config-3.18 | 1 + target/linux/brcm63xx/dts/bcm6318.dtsi | 10 + target/linux/brcm63xx/dts/bcm63268.dtsi | 10 + target/linux/brcm63xx/dts/bcm6328.dtsi | 10 + target/linux/brcm63xx/dts/bcm6362.dtsi | 10 + .../379-BCM63XX-pinmux-serial-LEDs.patch | 13 + .../patches-3.18/380-BCM63XX-add-LEDs-driver.patch | 398 +++++++++++++++++++++ .../403-6358-enet1-external-mii-clk.patch | 2 +- ...-allow-providing-fixup-data-in-board-data.patch | 4 +- ...8-MIPS-BCM63XX-pass-caldata-info-to-flash.patch | 2 +- .../420-BCM63XX-add-endian-check-for-ath9k.patch | 2 +- .../421-BCM63XX-add-led-pin-for-ath9k.patch | 2 +- ...22-BCM63XX-add-a-fixup-for-rt2x00-devices.patch | 2 +- 13 files changed, 459 insertions(+), 7 deletions(-) create mode 100644 target/linux/brcm63xx/patches-3.18/379-BCM63XX-pinmux-serial-LEDs.patch create mode 100644 target/linux/brcm63xx/patches-3.18/380-BCM63XX-add-LEDs-driver.patch diff --git a/target/linux/brcm63xx/config-3.18 b/target/linux/brcm63xx/config-3.18 index 0d7a5c7..227157e 100644 --- a/target/linux/brcm63xx/config-3.18 +++ b/target/linux/brcm63xx/config-3.18 @@ -133,6 +133,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_IRQ_WORK=y CONFIG_KEXEC=y +CONFIG_LEDS_BCM6328=y CONFIG_LEDS_GPIO=y CONFIG_LIBFDT=y CONFIG_MDIO_BOARDINFO=y diff --git a/target/linux/brcm63xx/dts/bcm6318.dtsi b/target/linux/brcm63xx/dts/bcm6318.dtsi index f851a9c..bcddcc5 100644 --- a/target/linux/brcm63xx/dts/bcm6318.dtsi +++ b/target/linux/brcm63xx/dts/bcm6318.dtsi @@ -6,6 +6,7 @@ aliases { gpio0 = &gpio0; gpio1 = &gpio1; + leds0 = &leds0; }; cpus { @@ -74,5 +75,14 @@ gpio-controller; #gpio-cells = <2>; }; + + leds0: led-controller@10000200 { + compatible = "brcm,bcm6318-leds"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x10000200 0x24>; + + status = "disabled"; + }; }; }; diff --git a/target/linux/brcm63xx/dts/bcm63268.dtsi b/target/linux/brcm63xx/dts/bcm63268.dtsi index 0a1f8b1..144cf05 100644 --- a/target/linux/brcm63xx/dts/bcm63268.dtsi +++ b/target/linux/brcm63xx/dts/bcm63268.dtsi @@ -6,6 +6,7 @@ aliases { gpio0 = &gpio0; gpio1 = &gpio1; + leds0 = &leds0; }; cpus { @@ -81,5 +82,14 @@ gpio-controller; #gpio-cells = <2>; }; + + leds0: led-controller@10001900 { + compatible = "brcm,bcm63268-leds"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x10001900 0x24>; + + status = "disabled"; + }; }; }; diff --git a/target/linux/brcm63xx/dts/bcm6328.dtsi b/target/linux/brcm63xx/dts/bcm6328.dtsi index a0b1316..d570e06 100644 --- a/target/linux/brcm63xx/dts/bcm6328.dtsi +++ b/target/linux/brcm63xx/dts/bcm6328.dtsi @@ -5,6 +5,7 @@ aliases { gpio0 = &gpio0; + leds0 = &leds0; }; cpus { @@ -63,5 +64,14 @@ gpio-controller; #gpio-cells = <2>; }; + + leds0: led-controller@10000800 { + compatible = "brcm,bcm6328-leds"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x10000800 0x24>; + + status = "disabled"; + }; }; }; diff --git a/target/linux/brcm63xx/dts/bcm6362.dtsi b/target/linux/brcm63xx/dts/bcm6362.dtsi index 6604f5c..dc3ea9e 100644 --- a/target/linux/brcm63xx/dts/bcm6362.dtsi +++ b/target/linux/brcm63xx/dts/bcm6362.dtsi @@ -6,6 +6,7 @@ aliases { gpio0 = &gpio0; gpio1 = &gpio1; + leds0 = &leds0; }; cpus { @@ -81,5 +82,14 @@ gpio-controller; #gpio-cells = <2>; }; + + leds0: led-controller@10001904 { + compatible = "brcm,bcm6362-leds"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x10001900 0x24>; + + status = "disabled"; + }; }; }; diff --git a/target/linux/brcm63xx/patches-3.18/379-BCM63XX-pinmux-serial-LEDs.patch b/target/linux/brcm63xx/patches-3.18/379-BCM63XX-pinmux-serial-LEDs.patch new file mode 100644 index 0000000..a59e862 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.18/379-BCM63XX-pinmux-serial-LEDs.patch @@ -0,0 +1,13 @@ +--- a/arch/mips/bcm63xx/boards/board_common.c ++++ b/arch/mips/bcm63xx/boards/board_common.c +@@ -106,6 +106,10 @@ void __init board_early_setup(const stru + GPIO_MODE_6348_G0_EXT_MII; + } + ++ /* Serial LEDs pinmux */ ++ if (BCMCPU_IS_63268()) ++ val |= BIT(0) | BIT(1); ++ + bcm_gpio_writel(val, GPIO_MODE_REG); + + #if IS_ENABLED(CONFIG_USB) diff --git a/target/linux/brcm63xx/patches-3.18/380-BCM63XX-add-LEDs-driver.patch b/target/linux/brcm63xx/patches-3.18/380-BCM63XX-add-LEDs-driver.patch new file mode 100644 index 0000000..a57036a --- /dev/null +++ b/target/linux/brcm63xx/patches-3.18/380-BCM63XX-add-LEDs-driver.patch @@ -0,0 +1,398 @@ +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -32,6 +32,13 @@ config LEDS_88PM860X + This option enables support for on-chip LED drivers found on Marvell + Semiconductor 88PM8606 PMIC. + ++config LEDS_BCM6328 ++ tristate "Serial LEDs support for BCM6328 chip" ++ depends on LEDS_CLASS ++ help ++ This option enables support for LEDs connected to the BCM6328 ++ LED HW controller accessed via MMIO registers. ++ + config LEDS_LM3530 + tristate "LCD Backlight driver for LM3530" + depends on LEDS_CLASS +--- /dev/null ++++ b/drivers/leds/leds-bcm6328.c +@@ -0,0 +1,369 @@ ++/* ++ * Driver for BCM6328 memory-mapped LEDs, based on leds-syscon.c ++ * ++ * Copyright 2015 Álvaro Fernández Rojas ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define REG_INIT 0x00 ++#define REG_MODE_HI 0x04 ++#define REG_MODE_LO 0x08 ++#define REG_HWDIS 0x0c ++#define REG_STROBE 0x10 ++#define REG_LNKACTSEL_HI 0x14 ++#define REG_LNKACTSEL_LO 0x18 ++#define REG_RBACK 0x1c ++#define REG_SERMUX 0x20 ++ ++#define LED_DEF_DELAY 500 ++ ++#define LED_INTERVAL_MS 20 ++#define LED_INTV_MASK 0x3f ++#define LED_FAST_INTV_SHIFT 6 ++#define LED_FAST_INTV_MASK (LED_INTV_MASK << LED_FAST_INTV_SHIFT) ++#define SERIAL_LED_EN BIT(12) ++#define SERIAL_LED_MUX BIT(13) ++#define SERIAL_LED_CLK_NPOL BIT(14) ++#define SERIAL_LED_DATA_PPOL BIT(15) ++#define SERIAL_LED_SHIFT_DIR BIT(16) ++#define LED_SHIFT_TEST BIT(30) ++#define LED_TEST BIT(31) ++ ++#define LED_MODE_MASK 3 ++#define LED_MODE_OFF 0 ++#define LED_MODE_FAST 1 ++#define LED_MODE_BLINK 2 ++#define LED_MODE_ON 3 ++#define LED_SHIFT(X) ((X) << 1) ++ ++/** ++ * struct bcm6328_led - state container for bcm6328 based LEDs ++ * @cdev: LED class device for this LED ++ * @mem: memory resource ++ * @lock: memory lock ++ * @pin: LED pin number ++ * @active_low: LED is active low ++ */ ++struct bcm6328_led { ++ struct led_classdev cdev; ++ void __iomem *mem; ++ spinlock_t *lock; ++ unsigned long pin; ++ unsigned long *blink_leds; ++ unsigned long *blink_del; ++ bool active_low; ++}; ++ ++static void bcm6328_led_write(void __iomem *reg, unsigned long data) ++{ ++ iowrite32be(data, reg); ++} ++ ++static unsigned long bcm6328_led_read(void __iomem *reg) ++{ ++ return ioread32be(reg); ++} ++ ++/** ++ * LEDMode: 64 bits / 2 bits per led -> 32 LEDs ++ * bits 0-31: LEDs 8-23 ++ * bits 32-47: LEDs 0-7 ++ * bits 48-63: LEDs 24-32 ++ */ ++static unsigned long bcm6328_pin2shift(unsigned long pin) ++{ ++ if(pin < 8) { ++ /* LEDs 0-7 (bits 32-47) */ ++ return pin + 16; ++ } ++ else if(pin < 23) { ++ /* LEDs 8-23 (bits 0-31) */ ++ return pin - 8; ++ } ++ else { ++ /* LEDs 24-31 (bits 48-63) */ ++ return pin; ++ } ++} ++ ++static void bcm6328_led_mode(struct bcm6328_led *led, ++ unsigned long value) ++{ ++ void __iomem *mode; ++ unsigned long val, shift; ++ ++ shift = bcm6328_pin2shift(led->pin); ++ if(shift / 16) { ++ mode = led->mem + REG_MODE_HI; ++ } ++ else { ++ mode = led->mem + REG_MODE_LO; ++ } ++ ++ val = bcm6328_led_read(mode); ++ val &= ~(LED_MODE_MASK << LED_SHIFT(shift % 16)); ++ val |= (value << LED_SHIFT(shift % 16)); ++ bcm6328_led_write(mode, val); ++} ++ ++static void bcm6328_led_set(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ struct bcm6328_led *led = ++ container_of(led_cdev, struct bcm6328_led, cdev); ++ unsigned long flags; ++ ++ spin_lock_irqsave(led->lock, flags); ++ *(led->blink_leds) &= ~BIT(led->pin); ++ if((led->active_low && value == LED_OFF) || ++ (!led->active_low && value != LED_OFF)) { ++ bcm6328_led_mode(led, LED_MODE_OFF); ++ } ++ else { ++ bcm6328_led_mode(led, LED_MODE_ON); ++ } ++ spin_unlock_irqrestore(led->lock, flags); ++} ++ ++static int bcm6328_blink_set(struct led_classdev *led_cdev, ++ unsigned long *delay_on, unsigned long *delay_off) ++{ ++ struct bcm6328_led *led = ++ container_of(led_cdev, struct bcm6328_led, cdev); ++ unsigned long delay_ms, delay, flags; ++ ++ if(!*delay_on && !*delay_off) { ++ delay_ms = LED_DEF_DELAY; ++ } ++ else if(*delay_on != *delay_off) { ++ if(!*delay_on) { ++ *delay_on = LED_DEF_DELAY; ++ } ++ if(!*delay_off) { ++ *delay_off = LED_DEF_DELAY; ++ } ++ dev_dbg(led_cdev->dev, "fallback to software blinking " ++ "(delay_on != delay_off)\n"); ++ return -EINVAL; ++ } ++ else { ++ delay_ms = *delay_on; ++ } ++ ++ delay = delay_ms / LED_INTERVAL_MS; ++ if (delay == 0) { ++ delay = 1; ++ } ++ else if(delay > LED_INTV_MASK) { ++ dev_dbg(led_cdev->dev, "fallback to software blinking " ++ "(delay > %ums)\n", LED_INTV_MASK * LED_INTERVAL_MS); ++ return -EINVAL; ++ } ++ ++ spin_lock_irqsave(led->lock, flags); ++ if(*(led->blink_leds) == 0 || ++ *(led->blink_leds) == BIT(led->pin) || ++ *(led->blink_del) == delay) { ++ unsigned long val; ++ ++ *(led->blink_leds) = BIT(led->pin); ++ *(led->blink_del) = delay; ++ ++ val = bcm6328_led_read(led->mem + REG_INIT); ++ val &= ~LED_FAST_INTV_MASK; ++ val |= (delay << LED_FAST_INTV_SHIFT); ++ bcm6328_led_write(led->mem + REG_INIT, val); ++ ++ bcm6328_led_mode(led, LED_MODE_BLINK); ++ ++ spin_unlock_irqrestore(led->lock, flags); ++ ++ return 0; ++ } ++ else { ++ spin_unlock_irqrestore(led->lock, flags); ++ dev_dbg(led_cdev->dev, "fallback to software blinking " ++ "(delay already configured)\n"); ++ return -EINVAL; ++ } ++} ++ ++static int bcm6328_leds_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct device_node *np = pdev->dev.of_node; ++ struct device_node *child; ++ struct resource *mem_r; ++ void __iomem *mem; ++ spinlock_t *lock; ++ unsigned long flags, val, *blink_leds, *blink_del; ++ ++ mem_r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!mem_r) ++ return -EINVAL; ++ ++ mem = devm_ioremap_resource(dev, mem_r); ++ if (IS_ERR(mem)) ++ return PTR_ERR(mem); ++ ++ lock = devm_kzalloc(dev, sizeof(*lock), GFP_KERNEL); ++ if (!lock) ++ return -ENOMEM; ++ ++ blink_leds = devm_kzalloc(dev, sizeof(*blink_leds), GFP_KERNEL); ++ if (!blink_leds) ++ return -ENOMEM; ++ ++ blink_del = devm_kzalloc(dev, sizeof(*blink_del), GFP_KERNEL); ++ if (!blink_del) ++ return -ENOMEM; ++ ++ spin_lock_init(lock); ++ ++ bcm6328_led_write(mem + REG_HWDIS, ~0); ++ bcm6328_led_write(mem + REG_LNKACTSEL_HI, 0); ++ bcm6328_led_write(mem + REG_LNKACTSEL_LO, 0); ++ ++ val = bcm6328_led_read(mem + REG_INIT); ++ val &= ~SERIAL_LED_EN; ++ if (of_get_property(np, "brcm,serial-leds", NULL)) ++ val |= SERIAL_LED_EN; ++ bcm6328_led_write(mem + REG_INIT, val); ++ ++ for_each_available_child_of_node(np, child) { ++ if (of_device_is_compatible(child, "bcm6328-led")) { ++ struct bcm6328_led *led; ++ const char *state; ++ u32 reg; ++ ++ led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); ++ if (!led) ++ return -ENOMEM; ++ ++ led->mem = mem; ++ led->lock = lock; ++ led->blink_leds = blink_leds; ++ led->blink_del = blink_del; ++ ++ if (of_property_read_u32(child, "reg", ®)) ++ continue; ++ led->pin = reg; ++ ++ if (of_get_property(child, "active-low", NULL)) ++ led->active_low = 1; ++ ++ led->cdev.name = ++ of_get_property(child, ++ "label", NULL) ? : child->name; ++ led->cdev.default_trigger = ++ of_get_property(child, ++ "linux,default-trigger", NULL); ++ ++ state = of_get_property(child, "default-state", NULL); ++ if (state) { ++ spin_lock_irqsave(lock, flags); ++ if (!strcmp(state, "on")) { ++ led->cdev.brightness = LED_FULL; ++ bcm6328_led_mode(led, LED_MODE_ON); ++ } ++ else if(!strcmp(state, "keep")) { ++ void __iomem *mode; ++ unsigned long val, shift; ++ ++ shift = bcm6328_pin2shift(led->pin); ++ if(shift / 16) { ++ mode = mem + REG_MODE_HI; ++ } ++ else { ++ mode = mem + REG_MODE_LO; ++ } ++ ++ val = bcm6328_led_read(mode) >> ++ (shift % 16); ++ val &= LED_MODE_MASK; ++ if(val == LED_MODE_ON) { ++ led->cdev.brightness = LED_FULL; ++ } ++ else { ++ led->cdev.brightness = LED_OFF; ++ bcm6328_led_mode(led, ++ LED_MODE_OFF); ++ } ++ } ++ else { ++ led->cdev.brightness = LED_OFF; ++ bcm6328_led_mode(led, LED_MODE_OFF); ++ } ++ spin_unlock_irqrestore(lock, flags); ++ } ++ ++ led->cdev.brightness_set = bcm6328_led_set; ++ led->cdev.blink_set = bcm6328_blink_set; ++ ++ if (led_classdev_register(dev, &led->cdev) < 0) ++ continue; ++ ++ dev_info(dev, "registered LED %s\n", led->cdev.name); ++ } ++ else if(of_device_is_compatible(child, "bcm6328-hw-led")) { ++ u32 reg, act_shift; ++ ++ if (of_property_read_u32(child, "reg", ®)) ++ continue; ++ ++ val = bcm6328_led_read(mem + REG_HWDIS); ++ val &= ~BIT(reg); ++ bcm6328_led_write(mem + REG_HWDIS, val); ++ ++ if (!of_property_read_u32(child, ++ "act-high", &act_shift)) { ++ val = bcm6328_led_read(mem + REG_LNKACTSEL_HI); ++ val |= (BIT(reg) << act_shift); ++ bcm6328_led_write(mem + REG_LNKACTSEL_HI, val); ++ } ++ ++ if (!of_property_read_u32(child, ++ "act-low", &act_shift)) { ++ val = bcm6328_led_read(mem + REG_LNKACTSEL_LO); ++ val |= (BIT(reg) << act_shift); ++ bcm6328_led_write(mem + REG_LNKACTSEL_LO, val); ++ } ++ } ++ else { ++ continue; ++ } ++ } ++ ++ return 0; ++} ++ ++static const struct of_device_id bcm6328_leds_of_match[] = { ++ { .compatible = "brcm,bcm6318-leds", }, ++ { .compatible = "brcm,bcm6328-leds", }, ++ { .compatible = "brcm,bcm6362-leds", }, ++ { .compatible = "brcm,bcm63268-leds", }, ++ {}, ++}; ++ ++static struct platform_driver bcm6328_leds_driver = { ++ .probe = bcm6328_leds_probe, ++ .driver = { ++ .name = "bcm6328-leds", ++ .of_match_table = of_match_ptr(bcm6328_leds_of_match), ++ }, ++}; ++ ++module_platform_driver(bcm6328_leds_driver); +--- a/drivers/leds/Makefile ++++ b/drivers/leds/Makefile +@@ -6,6 +6,7 @@ obj-$(CONFIG_LEDS_TRIGGERS) += led-trig + + # LED Platform Drivers + obj-$(CONFIG_LEDS_88PM860X) += leds-88pm860x.o ++obj-$(CONFIG_LEDS_BCM6328) += leds-bcm6328.o + obj-$(CONFIG_LEDS_BD2802) += leds-bd2802.o + obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o + obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o diff --git a/target/linux/brcm63xx/patches-3.18/403-6358-enet1-external-mii-clk.patch b/target/linux/brcm63xx/patches-3.18/403-6358-enet1-external-mii-clk.patch index 0745c3c..67907d8 100644 --- a/target/linux/brcm63xx/patches-3.18/403-6358-enet1-external-mii-clk.patch +++ b/target/linux/brcm63xx/patches-3.18/403-6358-enet1-external-mii-clk.patch @@ -8,7 +8,7 @@ + val |= GPIO_MODE_6358_ENET1_MII_CLK_INV; } - bcm_gpio_writel(val, GPIO_MODE_REG); + /* Serial LEDs pinmux */ --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h @@ -651,6 +651,8 @@ diff --git a/target/linux/brcm63xx/patches-3.18/413-BCM63XX-allow-providing-fixup-data-in-board-data.patch b/target/linux/brcm63xx/patches-3.18/413-BCM63XX-allow-providing-fixup-data-in-board-data.patch index 0960005..7bd587a 100644 --- a/target/linux/brcm63xx/patches-3.18/413-BCM63XX-allow-providing-fixup-data-in-board-data.patch +++ b/target/linux/brcm63xx/patches-3.18/413-BCM63XX-allow-providing-fixup-data-in-board-data.patch @@ -18,7 +18,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in board data #include "board_common.h" -@@ -196,6 +197,7 @@ int __init board_register_devices(void) +@@ -200,6 +201,7 @@ int __init board_register_devices(void) int button_count = 0; int led_count = 0; int usbh_ports = 0; @@ -26,7 +26,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in board data #if CONFIG_OF if (of_have_populated_dt()) { -@@ -296,6 +298,10 @@ int __init board_register_devices(void) +@@ -300,6 +302,10 @@ int __init board_register_devices(void) platform_device_register(&bcm63xx_gpio_keys_device); } diff --git a/target/linux/brcm63xx/patches-3.18/418-MIPS-BCM63XX-pass-caldata-info-to-flash.patch b/target/linux/brcm63xx/patches-3.18/418-MIPS-BCM63XX-pass-caldata-info-to-flash.patch index b329c31..0594071 100644 --- a/target/linux/brcm63xx/patches-3.18/418-MIPS-BCM63XX-pass-caldata-info-to-flash.patch +++ b/target/linux/brcm63xx/patches-3.18/418-MIPS-BCM63XX-pass-caldata-info-to-flash.patch @@ -11,7 +11,7 @@ Subject: [PATCH 69/80] MIPS: BCM63XX: pass caldata info to flash --- a/arch/mips/bcm63xx/boards/board_common.c +++ b/arch/mips/bcm63xx/boards/board_common.c -@@ -269,7 +269,7 @@ int __init board_register_devices(void) +@@ -273,7 +273,7 @@ int __init board_register_devices(void) if (board.num_spis) spi_register_board_info(board.spis, board.num_spis); diff --git a/target/linux/brcm63xx/patches-3.18/420-BCM63XX-add-endian-check-for-ath9k.patch b/target/linux/brcm63xx/patches-3.18/420-BCM63XX-add-endian-check-for-ath9k.patch index 5398c3d..d1267f0 100644 --- a/target/linux/brcm63xx/patches-3.18/420-BCM63XX-add-endian-check-for-ath9k.patch +++ b/target/linux/brcm63xx/patches-3.18/420-BCM63XX-add-endian-check-for-ath9k.patch @@ -39,7 +39,7 @@ return; --- a/arch/mips/bcm63xx/boards/board_common.c +++ b/arch/mips/bcm63xx/boards/board_common.c -@@ -300,7 +300,8 @@ int __init board_register_devices(void) +@@ -304,7 +304,8 @@ int __init board_register_devices(void) /* register any fixups */ for (i = 0; i < board.has_caldata; i++) diff --git a/target/linux/brcm63xx/patches-3.18/421-BCM63XX-add-led-pin-for-ath9k.patch b/target/linux/brcm63xx/patches-3.18/421-BCM63XX-add-led-pin-for-ath9k.patch index 1310136..d877f1d 100644 --- a/target/linux/brcm63xx/patches-3.18/421-BCM63XX-add-led-pin-for-ath9k.patch +++ b/target/linux/brcm63xx/patches-3.18/421-BCM63XX-add-led-pin-for-ath9k.patch @@ -1,6 +1,6 @@ --- a/arch/mips/bcm63xx/boards/board_common.c +++ b/arch/mips/bcm63xx/boards/board_common.c -@@ -301,7 +301,7 @@ int __init board_register_devices(void) +@@ -305,7 +305,7 @@ int __init board_register_devices(void) /* register any fixups */ for (i = 0; i < board.has_caldata; i++) pci_enable_ath9k_fixup(board.caldata[i].slot, board.caldata[i].caldata_offset, diff --git a/target/linux/brcm63xx/patches-3.18/422-BCM63XX-add-a-fixup-for-rt2x00-devices.patch b/target/linux/brcm63xx/patches-3.18/422-BCM63XX-add-a-fixup-for-rt2x00-devices.patch index bff489b..4f0ab57 100644 --- a/target/linux/brcm63xx/patches-3.18/422-BCM63XX-add-a-fixup-for-rt2x00-devices.patch +++ b/target/linux/brcm63xx/patches-3.18/422-BCM63XX-add-a-fixup-for-rt2x00-devices.patch @@ -36,7 +36,7 @@ Subject: [PATCH 72/72] 446-BCM63XX-add-a-fixup-for-rt2x00-devices #include "board_common.h" -@@ -299,9 +300,19 @@ int __init board_register_devices(void) +@@ -303,9 +304,19 @@ int __init board_register_devices(void) } /* register any fixups */