diff options
Diffstat (limited to 'libre/linux-libre-pck')
18 files changed, 59 insertions, 1845 deletions
diff --git a/libre/linux-libre-pck/0001-ARM-atags-add-support-for-Marvell-s-u-boot.patch b/libre/linux-libre-pck/0001-ARM-atags-add-support-for-Marvell-s-u-boot.patch deleted file mode 100644 index f67e039da..000000000 --- a/libre/linux-libre-pck/0001-ARM-atags-add-support-for-Marvell-s-u-boot.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 6cd78f818001a5e2caac7cadc3ffff95d752a021 Mon Sep 17 00:00:00 2001 -From: Willy Tarreau <w@xxxxxx> -Date: Sun, 2 Dec 2012 19:59:28 +0100 -Subject: [PATCH 01/14] ARM: atags: add support for Marvell's u-boot - -Marvell uses a specific atag in its u-boot which includes among other -information the MAC addresses for up to 4 network interfaces. - -Signed-off-by: Willy Tarreau <w@xxxxxx> ---- - arch/arm/include/uapi/asm/setup.h | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/arch/arm/include/uapi/asm/setup.h b/arch/arm/include/uapi/asm/setup.h -index 6b335a9ff8c8..614150b53643 100644 ---- a/arch/arm/include/uapi/asm/setup.h -+++ b/arch/arm/include/uapi/asm/setup.h -@@ -144,6 +144,18 @@ struct tag_memclk { - __u32 fmemclk; - }; - -+/* Marvell uboot parameters */ -+#define ATAG_MV_UBOOT 0x41000403 -+struct tag_mv_uboot { -+ __u32 uboot_version; -+ __u32 tclk; -+ __u32 sysclk; -+ __u32 isUsbHost; -+ __u8 macAddr[4][6]; -+ __u16 mtu[4]; -+ __u32 nand_ecc; -+}; -+ - struct tag { - struct tag_header hdr; - union { -@@ -166,6 +178,11 @@ struct tag { - * DC21285 specific - */ - struct tag_memclk memclk; -+ -+ /* -+ * Marvell specific -+ */ -+ struct tag_mv_uboot mv_uboot; - } u; - }; - --- -2.18.0 - diff --git a/libre/linux-libre-pck/0002-ARM-atags-fdt-retrieve-MAC-addresses-from-Marvell-bo.patch b/libre/linux-libre-pck/0002-ARM-atags-fdt-retrieve-MAC-addresses-from-Marvell-bo.patch deleted file mode 100644 index e834eae8e..000000000 --- a/libre/linux-libre-pck/0002-ARM-atags-fdt-retrieve-MAC-addresses-from-Marvell-bo.patch +++ /dev/null @@ -1,47 +0,0 @@ -From a383c6aaa67e862797d380a5163e633637358568 Mon Sep 17 00:00:00 2001 -From: Willy Tarreau <w@xxxxxx> -Date: Sun, 2 Dec 2012 19:56:58 +0100 -Subject: [PATCH 02/14] ARM: atags/fdt: retrieve MAC addresses from Marvell - boot loader - -The atags are parsed and if a Marvell atag is found, up to 4 MAC -addresses are extracted there and assigned to node aliases eth0..3 -with the name "mac-address". - -This was tested on my Mirabox and the two NICs had their correct -address set. - -Signed-off-by: Willy Tarreau <w@xxxxxx> ---- - arch/arm/boot/compressed/atags_to_fdt.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c -index 41fa7316c52b..807ed160a4b9 100644 ---- a/arch/arm/boot/compressed/atags_to_fdt.c -+++ b/arch/arm/boot/compressed/atags_to_fdt.c -@@ -19,7 +19,7 @@ static int node_offset(void *fdt, const char *node_path) - } - - static int setprop(void *fdt, const char *node_path, const char *property, -- uint32_t *val_array, int size) -+ void *val_array, int size) - { - int offset = node_offset(fdt, node_path); - if (offset < 0) -@@ -180,6 +180,12 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) - initrd_start); - setprop_cell(fdt, "/chosen", "linux,initrd-end", - initrd_start + initrd_size); -+ } else if (atag->hdr.tag == ATAG_MV_UBOOT) { -+ /* This ATAG provides up to 4 MAC addresses */ -+ setprop(fdt, "eth0", "mac-address", atag->u.mv_uboot.macAddr[0], 6); -+ setprop(fdt, "eth1", "mac-address", atag->u.mv_uboot.macAddr[1], 6); -+ setprop(fdt, "eth2", "mac-address", atag->u.mv_uboot.macAddr[2], 6); -+ setprop(fdt, "eth3", "mac-address", atag->u.mv_uboot.macAddr[3], 6); - } - } - --- -2.18.0 - diff --git a/libre/linux-libre-pck/0003-SMILE-Plug-device-tree-file.patch b/libre/linux-libre-pck/0003-SMILE-Plug-device-tree-file.patch deleted file mode 100644 index 03af05aa9..000000000 --- a/libre/linux-libre-pck/0003-SMILE-Plug-device-tree-file.patch +++ /dev/null @@ -1,209 +0,0 @@ -From 121aa156d4d107cf2b174c8eac89c7c473c43829 Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich <kevin@archlinuxarm.org> -Date: Fri, 5 Sep 2014 15:41:19 -0600 -Subject: [PATCH 03/14] SMILE Plug device tree file - -This adds a dts file for the SMILE Plug, which only differs from the Mirabox -dts with the LED definitions. - -Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org> ---- - arch/arm/boot/dts/Makefile | 1 + - arch/arm/boot/dts/armada-370-smileplug.dts | 173 +++++++++++++++++++++ - 2 files changed, 174 insertions(+) - create mode 100644 arch/arm/boot/dts/armada-370-smileplug.dts - -diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index 37a3de760d40..823a9ef2675d 100644 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -1115,6 +1115,7 @@ dtb-$(CONFIG_MACH_ARMADA_370) += \ - armada-370-db.dtb \ - armada-370-dlink-dns327l.dtb \ - armada-370-mirabox.dtb \ -+ armada-370-smileplug.dtb \ - armada-370-netgear-rn102.dtb \ - armada-370-netgear-rn104.dtb \ - armada-370-rd.dtb \ -diff --git a/arch/arm/boot/dts/armada-370-smileplug.dts b/arch/arm/boot/dts/armada-370-smileplug.dts -new file mode 100644 -index 000000000000..d01308ab848b ---- /dev/null -+++ b/arch/arm/boot/dts/armada-370-smileplug.dts -@@ -0,0 +1,173 @@ -+/* -+ * Device Tree file for Marvell SMILE Plug -+ * -+ * Kevin Mihelich <kevin@archlinuxarm.org> -+ * Gregory CLEMENT <gregory.clement@free-electrons.com> -+ * -+ * This file is licensed under the terms of the GNU General Public -+ * License version 2. This program is licensed "as is" without any -+ * warranty of any kind, whether express or implied. -+ */ -+ -+/dts-v1/; -+#include <dt-bindings/gpio/gpio.h> -+#include "armada-370.dtsi" -+ -+/ { -+ model = "Marvell SMILE Plug"; -+ compatible = "marvell,smileplug", "marvell,armada370", "marvell,armada-370-xp"; -+ -+ chosen { -+ bootargs = "console=ttyS0,115200 earlyprintk"; -+ }; -+ -+ memory { -+ device_type = "memory"; -+ reg = <0x00000000 0x20000000>; /* 512 MB */ -+ }; -+ -+ soc { -+ ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000 -+ MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>; -+ -+ pcie-controller { -+ status = "okay"; -+ -+ /* Internal mini-PCIe connector */ -+ pcie@1,0 { -+ /* Port 0, Lane 0 */ -+ status = "okay"; -+ }; -+ -+ /* Connected on the PCB to a USB 3.0 XHCI controller */ -+ pcie@2,0 { -+ /* Port 1, Lane 0 */ -+ status = "okay"; -+ }; -+ }; -+ -+ internal-regs { -+ serial@12000 { -+ status = "okay"; -+ }; -+ timer@20300 { -+ clock-frequency = <600000000>; -+ status = "okay"; -+ }; -+ -+ gpio_leds { -+ compatible = "gpio-leds"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&smile_led_pins>; -+ -+ red_eyes_led { -+ label = "smileplug:red:eyes"; -+ gpios = <&gpio1 31 0>; -+ default-state = "off"; -+ }; -+ -+ green_eyes_led { -+ label = "smileplug:green:eyes"; -+ gpios = <&gpio2 0 0>; -+ linux,default-trigger = "default-on"; -+ }; -+ -+ red_smile_led { -+ label = "smileplug:red:smile"; -+ gpios = <&gpio1 15 0>; -+ default-state = "off"; -+ }; -+ -+ green_smile_led { -+ label = "smileplug:green:smile"; -+ gpios = <&gpio1 27 0>; -+ linux,default-trigger = "default-on"; -+ }; -+ }; -+ -+ mdio { -+ pinctrl-0 = <&mdio_pins>; -+ pinctrl-names = "default"; -+ phy0: ethernet-phy@0 { -+ reg = <0>; -+ }; -+ -+ phy1: ethernet-phy@1 { -+ reg = <1>; -+ }; -+ }; -+ ethernet@70000 { -+ pinctrl-0 = <&ge0_rgmii_pins>; -+ pinctrl-names = "default"; -+ status = "okay"; -+ phy = <&phy0>; -+ phy-mode = "rgmii-id"; -+ }; -+ ethernet@74000 { -+ pinctrl-0 = <&ge1_rgmii_pins>; -+ pinctrl-names = "default"; -+ status = "okay"; -+ phy = <&phy1>; -+ phy-mode = "rgmii-id"; -+ }; -+ -+ mvsdio@d4000 { -+ pinctrl-0 = <&sdio_pins3>; -+ pinctrl-names = "default"; -+ status = "okay"; -+ /* -+ * No CD or WP GPIOs: SDIO interface used for -+ * Wifi/Bluetooth chip -+ */ -+ broken-cd; -+ }; -+ -+ usb@50000 { -+ status = "okay"; -+ }; -+ -+ usb@51000 { -+ status = "okay"; -+ }; -+ -+ i2c@11000 { -+ status = "okay"; -+ clock-frequency = <100000>; -+ pca9505: pca9505@25 { -+ compatible = "nxp,pca9505"; -+ gpio-controller; -+ #gpio-cells = <2>; -+ reg = <0x25>; -+ }; -+ }; -+ -+ nand@d0000 { -+ status = "okay"; -+ num-cs = <1>; -+ marvell,nand-keep-config; -+ marvell,nand-enable-arbiter; -+ nand-on-flash-bbt; -+ -+ partition@0 { -+ label = "U-Boot"; -+ reg = <0 0x400000>; -+ }; -+ partition@400000 { -+ label = "Linux"; -+ reg = <0x400000 0x400000>; -+ }; -+ partition@800000 { -+ label = "Filesystem"; -+ reg = <0x800000 0x3f800000>; -+ }; -+ }; -+ }; -+ }; -+}; -+ -+&pinctrl { -+ smile_led_pins: smile-led-pins { -+ marvell,pins = "mpp63", "mpp64", "mpp47", "mpp59"; -+ marvell,function = "gpio"; -+ }; -+}; --- -2.18.0 - diff --git a/libre/linux-libre-pck/0004-fix-mvsdio-eMMC-timing.patch b/libre/linux-libre-pck/0004-fix-mvsdio-eMMC-timing.patch deleted file mode 100644 index 4669a97ab..000000000 --- a/libre/linux-libre-pck/0004-fix-mvsdio-eMMC-timing.patch +++ /dev/null @@ -1,38 +0,0 @@ -From bca0f6d98bb3003178d962f83ba795d524460346 Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich <kevin@archlinuxarm.org> -Date: Fri, 5 Sep 2014 15:43:56 -0600 -Subject: [PATCH 04/14] fix mvsdio eMMC timing - -These changes from Globalscale change the MMC timing to allow the eMMC versions -of the Mirabox and SMILE Plug to work. - -Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org> ---- - drivers/mmc/host/mvsdio.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c -index e22bbff89c8d..6b30c850ce07 100644 ---- a/drivers/mmc/host/mvsdio.c -+++ b/drivers/mmc/host/mvsdio.c -@@ -93,7 +93,7 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data) - tmout_index = fls(tmout - 1) - 12; - if (tmout_index < 0) - tmout_index = 0; -- if (tmout_index > MVSD_HOST_CTRL_TMOUT_MAX) -+// if (tmout_index > MVSD_HOST_CTRL_TMOUT_MAX) //by steven, try to setup the timeout to maximum value - tmout_index = MVSD_HOST_CTRL_TMOUT_MAX; - - dev_dbg(host->dev, "data %s at 0x%08x: blocks=%d blksz=%d tmout=%u (%d)\n", -@@ -616,6 +616,8 @@ static void mvsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) - u32 m = DIV_ROUND_UP(host->base_clock, ios->clock) - 1; - if (m > MVSD_BASE_DIV_MAX) - m = MVSD_BASE_DIV_MAX; -+ if(ios->clock==50000000 ) //by steven -+ m=1; - mvsd_write(MVSD_CLK_DIV, m); - host->clock = ios->clock; - host->ns_per_clk = 1000000000 / (host->base_clock / (m+1)); --- -2.18.0 - diff --git a/libre/linux-libre-pck/0005-net-smsc95xx-Allow-mac-address-to-be-set-as-a-parame.patch b/libre/linux-libre-pck/0005-net-smsc95xx-Allow-mac-address-to-be-set-as-a-parame.patch deleted file mode 100644 index fbbde259a..000000000 --- a/libre/linux-libre-pck/0005-net-smsc95xx-Allow-mac-address-to-be-set-as-a-parame.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 021b0a93050b75f56690bbe41fc470c77f7573c0 Mon Sep 17 00:00:00 2001 -From: popcornmix <popcornmix@gmail.com> -Date: Tue, 18 Feb 2014 01:43:50 -0300 -Subject: [PATCH 05/14] net/smsc95xx: Allow mac address to be set as a - parameter - ---- - drivers/net/usb/smsc95xx.c | 56 ++++++++++++++++++++++++++++++++++++++ - 1 file changed, 56 insertions(+) - -diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c -index 06b4d290784d..3be3b5a4a176 100644 ---- a/drivers/net/usb/smsc95xx.c -+++ b/drivers/net/usb/smsc95xx.c -@@ -60,6 +60,7 @@ - #define SUSPEND_SUSPEND3 (0x08) - #define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \ - SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3) -+#define MAC_ADDR_LEN (6) - - #define CARRIER_CHECK_DELAY (2 * HZ) - -@@ -82,6 +83,10 @@ static bool turbo_mode = true; - module_param(turbo_mode, bool, 0644); - MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); - -+static char *macaddr = ":"; -+module_param(macaddr, charp, 0); -+MODULE_PARM_DESC(macaddr, "MAC address"); -+ - static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index, - u32 *data, int in_pm) - { -@@ -910,8 +915,59 @@ static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) - return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); - } - -+/* Check the macaddr module parameter for a MAC address */ -+static int smsc95xx_is_macaddr_param(struct usbnet *dev, u8 *dev_mac) -+{ -+ int i, j, got_num, num; -+ u8 mtbl[MAC_ADDR_LEN]; -+ -+ if (macaddr[0] == ':') -+ return 0; -+ -+ i = 0; -+ j = 0; -+ num = 0; -+ got_num = 0; -+ while (j < MAC_ADDR_LEN) { -+ if (macaddr[i] && macaddr[i] != ':') { -+ got_num++; -+ if ('0' <= macaddr[i] && macaddr[i] <= '9') -+ num = num * 16 + macaddr[i] - '0'; -+ else if ('A' <= macaddr[i] && macaddr[i] <= 'F') -+ num = num * 16 + 10 + macaddr[i] - 'A'; -+ else if ('a' <= macaddr[i] && macaddr[i] <= 'f') -+ num = num * 16 + 10 + macaddr[i] - 'a'; -+ else -+ break; -+ i++; -+ } else if (got_num == 2) { -+ mtbl[j++] = (u8) num; -+ num = 0; -+ got_num = 0; -+ i++; -+ } else { -+ break; -+ } -+ } -+ -+ if (j == MAC_ADDR_LEN) { -+ netif_dbg(dev, ifup, dev->net, "Overriding MAC address with: " -+ "%02x:%02x:%02x:%02x:%02x:%02x\n", mtbl[0], mtbl[1], mtbl[2], -+ mtbl[3], mtbl[4], mtbl[5]); -+ for (i = 0; i < MAC_ADDR_LEN; i++) -+ dev_mac[i] = mtbl[i]; -+ return 1; -+ } else { -+ return 0; -+ } -+} -+ - static void smsc95xx_init_mac_address(struct usbnet *dev) - { -+ /* Check module parameters */ -+ if (smsc95xx_is_macaddr_param(dev, dev->net->dev_addr)) -+ return; -+ - const u8 *mac_addr; - - /* maybe the boot loader passed the MAC address in devicetree */ --- -2.18.0 - diff --git a/libre/linux-libre-pck/0006-set-default-cubietruck-led-triggers.patch b/libre/linux-libre-pck/0006-set-default-cubietruck-led-triggers.patch deleted file mode 100644 index ba60dea49..000000000 --- a/libre/linux-libre-pck/0006-set-default-cubietruck-led-triggers.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 529b0cbe182106ce8b52cf465f3c54c3e0f12e1c Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich <kevin@archlinuxarm.org> -Date: Sat, 14 Feb 2015 12:32:27 +0100 -Subject: [PATCH 06/14] set default cubietruck led triggers - -Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org> ---- - arch/arm/boot/dts/sun7i-a20-cubietruck.dts | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts -index 5649161de1d7..2be64a886555 100644 ---- a/arch/arm/boot/dts/sun7i-a20-cubietruck.dts -+++ b/arch/arm/boot/dts/sun7i-a20-cubietruck.dts -@@ -80,6 +80,7 @@ - blue { - label = "cubietruck:blue:usr"; - gpios = <&pio 7 21 GPIO_ACTIVE_HIGH>; -+ linux,default-trigger = "heartbeat"; - }; - - orange { -@@ -95,6 +96,7 @@ - green { - label = "cubietruck:green:usr"; - gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; -+ linux,default-trigger = "mmc0"; - }; - }; - --- -2.18.0 - diff --git a/libre/linux-libre-pck/0007-exynos4412-odroid-set-higher-minimum-buck2-regulator.patch b/libre/linux-libre-pck/0007-exynos4412-odroid-set-higher-minimum-buck2-regulator.patch deleted file mode 100644 index ed7f4e596..000000000 --- a/libre/linux-libre-pck/0007-exynos4412-odroid-set-higher-minimum-buck2-regulator.patch +++ /dev/null @@ -1,30 +0,0 @@ -From adec3bf3f301ddb15994be72c92f43cc5569dd03 Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich <kevin@archlinuxarm.org> -Date: Thu, 11 Aug 2016 00:42:37 -0600 -Subject: [PATCH 07/14] exynos4412-odroid: set higher minimum buck2 regulator - voltage - -Set a higher minimum voltage to help reboot issue. -http://www.spinics.net/lists/linux-samsung-soc/msg54434.html - -Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org> ---- - arch/arm/boot/dts/exynos4412-odroid-common.dtsi | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi -index a09e46c9dbc0..d8117a820812 100644 ---- a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi -+++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi -@@ -423,7 +423,7 @@ - - buck2_reg: BUCK2 { - regulator-name = "vdd_arm"; -- regulator-min-microvolt = <900000>; -+ regulator-min-microvolt = <1100000>; - regulator-max-microvolt = <1350000>; - regulator-always-on; - regulator-boot-on; --- -2.18.0 - diff --git a/libre/linux-libre-pck/0008-ARM-dove-enable-ethernet-on-D3Plug.patch b/libre/linux-libre-pck/0008-ARM-dove-enable-ethernet-on-D3Plug.patch deleted file mode 100644 index 5395e2b7d..000000000 --- a/libre/linux-libre-pck/0008-ARM-dove-enable-ethernet-on-D3Plug.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 58b7a9138a44bef39a860611354c3dac0f558b1f Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich <kevin@archlinuxarm.org> -Date: Sun, 7 May 2017 13:32:25 -0600 -Subject: [PATCH 08/14] ARM: dove: enable ethernet on D3Plug - -Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org> ---- - arch/arm/boot/dts/dove-d3plug.dts | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/arch/arm/boot/dts/dove-d3plug.dts b/arch/arm/boot/dts/dove-d3plug.dts -index 826026c28f90..a4c9963e1261 100644 ---- a/arch/arm/boot/dts/dove-d3plug.dts -+++ b/arch/arm/boot/dts/dove-d3plug.dts -@@ -61,6 +61,13 @@ - &uart0 { status = "okay"; }; - &sata0 { status = "okay"; }; - &i2c0 { status = "okay"; }; -+&mdio { status = "okay"; }; -+ð { status = "okay"; }; -+ -+ðphy { -+ compatible = "marvell,88e1310"; -+ reg = <1>; -+}; - - /* Samsung M8G2F eMMC */ - &sdio0 { --- -2.18.0 - diff --git a/libre/linux-libre-pck/0009-power-add-power-sequence-library.patch b/libre/linux-libre-pck/0009-power-add-power-sequence-library.patch deleted file mode 100644 index c0da023ca..000000000 --- a/libre/linux-libre-pck/0009-power-add-power-sequence-library.patch +++ /dev/null @@ -1,790 +0,0 @@ -From 4ddcbb9ed40c97371724245d0b8d01d471bb6570 Mon Sep 17 00:00:00 2001 -From: Peter Chen <peter.chen@nxp.com> -Date: Wed, 21 Jun 2017 14:42:03 +0800 -Subject: [PATCH 09/14] power: add power sequence library - -We have an well-known problem that the device needs to do some power -sequence before it can be recognized by related host, the typical -example like hard-wired mmc devices and usb devices. - -This power sequence is hard to be described at device tree and handled by -related host driver, so we have created a common power sequence -library to cover this requirement. The core code has supplied -some common helpers for host driver, and individual power sequence -libraries handle kinds of power sequence for devices. The pwrseq -librares always need to allocate extra instance for compatible -string match. - -pwrseq_generic is intended for general purpose of power sequence, which -handles gpios and clocks currently, and can cover other controls in -future. The host driver just needs to call of_pwrseq_on/of_pwrseq_off -if only one power sequence is needed, else call of_pwrseq_on_list -/of_pwrseq_off_list instead (eg, USB hub driver). - -For new power sequence library, it needs to add its compatible string -and allocation function at pwrseq_match_table_list, then the pwrseq -core will match it with DT's, and choose this library at runtime. - -Signed-off-by: Peter Chen <peter.chen@nxp.com> -Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name> -Tested-by Joshua Clayton <stillcompiling@gmail.com> -Reviewed-by: Matthias Kaehlcke <mka@chromium.org> -Tested-by: Matthias Kaehlcke <mka@chromium.org> ---- - Documentation/power/power-sequence/design.rst | 54 ++++ - MAINTAINERS | 9 + - drivers/power/Kconfig | 1 + - drivers/power/Makefile | 1 + - drivers/power/pwrseq/Kconfig | 20 ++ - drivers/power/pwrseq/Makefile | 2 + - drivers/power/pwrseq/core.c | 293 ++++++++++++++++++ - drivers/power/pwrseq/pwrseq_generic.c | 210 +++++++++++++ - include/linux/power/pwrseq.h | 84 +++++ - 9 files changed, 674 insertions(+) - create mode 100644 Documentation/power/power-sequence/design.rst - create mode 100644 drivers/power/pwrseq/Kconfig - create mode 100644 drivers/power/pwrseq/Makefile - create mode 100644 drivers/power/pwrseq/core.c - create mode 100644 drivers/power/pwrseq/pwrseq_generic.c - create mode 100644 include/linux/power/pwrseq.h - -diff --git a/Documentation/power/power-sequence/design.rst b/Documentation/power/power-sequence/design.rst -new file mode 100644 -index 000000000000..554608e5f3b6 ---- /dev/null -+++ b/Documentation/power/power-sequence/design.rst -@@ -0,0 +1,54 @@ -+==================================== -+Power Sequence Library -+==================================== -+ -+:Date: Feb, 2017 -+:Author: Peter Chen <peter.chen@nxp.com> -+ -+ -+Introduction -+============ -+ -+We have an well-known problem that the device needs to do a power -+sequence before it can be recognized by related host, the typical -+examples are hard-wired mmc devices and usb devices. The host controller -+can't know what kinds of this device is in its bus if the power -+sequence has not done, since the related devices driver's probe calling -+is determined by runtime according to eunumeration results. Besides, -+the devices may have custom power sequence, so the power sequence library -+which is independent with the devices is needed. -+ -+Design -+============ -+ -+The power sequence library includes the core file and customer power -+sequence library. The core file exports interfaces are called by -+host controller driver for power sequence and customer power sequence -+library files to register its power sequence instance to global -+power sequence list. The custom power sequence library creates power -+sequence instance and implement custom power sequence. -+ -+Since the power sequence describes hardware design, the description is -+located at board description file, eg, device tree dts file. And -+a specific power sequence belongs to device, so its description -+is under the device node, please refer to: -+Documentation/devicetree/bindings/power/pwrseq/pwrseq-generic.txt -+ -+Custom power sequence library allocates one power sequence instance at -+bootup periods using postcore_initcall, this static allocated instance is -+used to compare with device-tree (DT) node to see if this library can be -+used for the node or not. When the result is matched, the core API will -+try to get resourses (->get, implemented at each library) for power -+sequence, if all resources are got, it will try to allocate another -+instance for next possible request from host driver. -+ -+Then, the host controller driver can carry out power sequence on for this -+DT node, the library will do corresponding operations, like open clocks, -+toggle gpio, etc. The power sequence off routine will close and free the -+resources, and is called when the parent is removed. And the power -+sequence suspend and resume routine can be called at host driver's -+suspend and resume routine if needed. -+ -+The exported interfaces -+.. kernel-doc:: drivers/power/pwrseq/core.c -+ :export: -diff --git a/MAINTAINERS b/MAINTAINERS -index 96e98e206b0d..99339375209c 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -11398,6 +11398,15 @@ F: drivers/firmware/psci*.c - F: include/linux/psci.h - F: include/uapi/linux/psci.h - -+POWER SEQUENCE LIBRARY -+M: Peter Chen <Peter.Chen@nxp.com> -+T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git -+L: linux-pm@vger.kernel.org -+S: Maintained -+F: Documentation/devicetree/bindings/power/pwrseq/ -+F: drivers/power/pwrseq/ -+F: include/linux/power/pwrseq.h -+ - POWER SUPPLY CLASS/SUBSYSTEM and DRIVERS - M: Sebastian Reichel <sre@kernel.org> - L: linux-pm@vger.kernel.org -diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig -index 63454b5cac27..c1bb0465f956 100644 ---- a/drivers/power/Kconfig -+++ b/drivers/power/Kconfig -@@ -1,3 +1,4 @@ - source "drivers/power/avs/Kconfig" - source "drivers/power/reset/Kconfig" - source "drivers/power/supply/Kconfig" -+source "drivers/power/pwrseq/Kconfig" -diff --git a/drivers/power/Makefile b/drivers/power/Makefile -index ff35c712d824..7db80354b691 100644 ---- a/drivers/power/Makefile -+++ b/drivers/power/Makefile -@@ -1,3 +1,4 @@ - obj-$(CONFIG_POWER_AVS) += avs/ - obj-$(CONFIG_POWER_RESET) += reset/ - obj-$(CONFIG_POWER_SUPPLY) += supply/ -+obj-$(CONFIG_POWER_SEQUENCE) += pwrseq/ -diff --git a/drivers/power/pwrseq/Kconfig b/drivers/power/pwrseq/Kconfig -new file mode 100644 -index 000000000000..c6b356926cca ---- /dev/null -+++ b/drivers/power/pwrseq/Kconfig -@@ -0,0 +1,20 @@ -+# -+# Power Sequence library -+# -+ -+menuconfig POWER_SEQUENCE -+ bool "Power sequence control" -+ help -+ It is used for drivers which needs to do power sequence -+ (eg, turn on clock, toggle reset gpio) before the related -+ devices can be found by hardware, eg, USB bus. -+ -+if POWER_SEQUENCE -+ -+config PWRSEQ_GENERIC -+ bool "Generic power sequence control" -+ depends on OF -+ help -+ This is the generic power sequence control library, and is -+ supposed to support common power sequence usage. -+endif -diff --git a/drivers/power/pwrseq/Makefile b/drivers/power/pwrseq/Makefile -new file mode 100644 -index 000000000000..ad82389028c2 ---- /dev/null -+++ b/drivers/power/pwrseq/Makefile -@@ -0,0 +1,2 @@ -+obj-$(CONFIG_POWER_SEQUENCE) += core.o -+obj-$(CONFIG_PWRSEQ_GENERIC) += pwrseq_generic.o -diff --git a/drivers/power/pwrseq/core.c b/drivers/power/pwrseq/core.c -new file mode 100644 -index 000000000000..6b78a6691683 ---- /dev/null -+++ b/drivers/power/pwrseq/core.c -@@ -0,0 +1,293 @@ -+/* -+ * core.c power sequence core file -+ * -+ * Copyright (C) 2016 Freescale Semiconductor, Inc. -+ * Author: Peter Chen <peter.chen@nxp.com> -+ * -+ * This program is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 of -+ * the License as published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. -+ */ -+ -+#include <linux/list.h> -+#include <linux/mutex.h> -+#include <linux/of.h> -+#include <linux/slab.h> -+#include <linux/power/pwrseq.h> -+ -+/* -+ * Static power sequence match table -+ * - Add compatible (the same with dts node) and related allocation function. -+ * - Update related binding doc. -+ */ -+static const struct of_device_id pwrseq_match_table_list[] = { -+ { .compatible = "usb424,2513", .data = &pwrseq_generic_alloc_instance}, -+ { .compatible = "usb424,2514", .data = &pwrseq_generic_alloc_instance}, -+ { /* sentinel */ } -+}; -+ -+static int pwrseq_get(struct device_node *np, struct pwrseq *p) -+{ -+ if (p && p->get) -+ return p->get(np, p); -+ -+ return -ENOTSUPP; -+} -+ -+static int pwrseq_on(struct pwrseq *p) -+{ -+ if (p && p->on) -+ return p->on(p); -+ -+ return -ENOTSUPP; -+} -+ -+static void pwrseq_off(struct pwrseq *p) -+{ -+ if (p && p->off) -+ p->off(p); -+} -+ -+static void pwrseq_put(struct pwrseq *p) -+{ -+ if (p && p->put) -+ p->put(p); -+} -+ -+/** -+ * of_pwrseq_on - Carry out power sequence on for device node -+ * -+ * @np: the device node would like to power on -+ * -+ * Carry out a single device power on. If multiple devices -+ * need to be handled, use of_pwrseq_on_list() instead. -+ * -+ * Return a pointer to the power sequence instance on success, or NULL if -+ * not exist, or an error code on failure. -+ */ -+struct pwrseq *of_pwrseq_on(struct device_node *np) -+{ -+ struct pwrseq *pwrseq; -+ int ret; -+ const struct of_device_id *of_id; -+ struct pwrseq *(*alloc_instance)(void); -+ -+ of_id = of_match_node(pwrseq_match_table_list, np); -+ if (!of_id) -+ return NULL; -+ -+ alloc_instance = of_id->data; -+ /* Allocate pwrseq instance */ -+ pwrseq = alloc_instance(); -+ if (IS_ERR(pwrseq)) -+ return pwrseq; -+ -+ ret = pwrseq_get(np, pwrseq); -+ if (ret) -+ goto pwr_put; -+ -+ ret = pwrseq_on(pwrseq); -+ if (ret) -+ goto pwr_put; -+ -+ return pwrseq; -+ -+pwr_put: -+ pwrseq_put(pwrseq); -+ return ERR_PTR(ret); -+} -+EXPORT_SYMBOL_GPL(of_pwrseq_on); -+ -+/** -+ * of_pwrseq_off - Carry out power sequence off for this pwrseq instance -+ * -+ * @pwrseq: the pwrseq instance which related device would like to be off -+ * -+ * This API is used to power off single device, it is the opposite -+ * operation for of_pwrseq_on. -+ */ -+void of_pwrseq_off(struct pwrseq *pwrseq) -+{ -+ pwrseq_off(pwrseq); -+ pwrseq_put(pwrseq); -+} -+EXPORT_SYMBOL_GPL(of_pwrseq_off); -+ -+/** -+ * of_pwrseq_on_list - Carry out power sequence on for list -+ * -+ * @np: the device node would like to power on -+ * @head: the list head for pwrseq list on this bus -+ * -+ * This API is used to power on multiple devices at single bus. -+ * If there are several devices on bus (eg, USB bus), uses this -+ * this API. Otherwise, use of_pwrseq_on instead. After the device -+ * is powered on successfully, it will be added to pwrseq list for -+ * this bus. The caller needs to use mutex_lock for concurrent. -+ * -+ * Return 0 on success, or -ENOENT if not exist, or an error value on failure. -+ */ -+int of_pwrseq_on_list(struct device_node *np, struct list_head *head) -+{ -+ struct pwrseq *pwrseq; -+ struct pwrseq_list_per_dev *pwrseq_list_node; -+ -+ pwrseq_list_node = kzalloc(sizeof(*pwrseq_list_node), GFP_KERNEL); -+ if (!pwrseq_list_node) -+ return -ENOMEM; -+ -+ pwrseq = of_pwrseq_on(np); -+ if (!pwrseq) -+ return -ENOENT; -+ -+ if (IS_ERR(pwrseq)) { -+ kfree(pwrseq_list_node); -+ return PTR_ERR(pwrseq); -+ } -+ -+ pwrseq_list_node->pwrseq = pwrseq; -+ list_add(&pwrseq_list_node->list, head); -+ -+ return 0; -+} -+EXPORT_SYMBOL_GPL(of_pwrseq_on_list); -+ -+/** -+ * of_pwrseq_off_list - Carry out power sequence off for the list -+ * -+ * @head: the list head for pwrseq instance list on this bus -+ * -+ * This API is used to power off all devices on this bus, it is -+ * the opposite operation for of_pwrseq_on_list. -+ * The caller needs to use mutex_lock for concurrent. -+ */ -+void of_pwrseq_off_list(struct list_head *head) -+{ -+ struct pwrseq *pwrseq; -+ struct pwrseq_list_per_dev *pwrseq_list_node, *tmp_node; -+ -+ list_for_each_entry_safe(pwrseq_list_node, tmp_node, head, list) { -+ pwrseq = pwrseq_list_node->pwrseq; -+ of_pwrseq_off(pwrseq); -+ list_del(&pwrseq_list_node->list); -+ kfree(pwrseq_list_node); -+ } -+} -+EXPORT_SYMBOL_GPL(of_pwrseq_off_list); -+ -+/** -+ * pwrseq_suspend - Carry out power sequence suspend for this pwrseq instance -+ * -+ * @pwrseq: the pwrseq instance -+ * -+ * This API is used to do suspend operation on pwrseq instance. -+ * -+ * Return 0 on success, or an error value otherwise. -+ */ -+int pwrseq_suspend(struct pwrseq *p) -+{ -+ int ret = 0; -+ -+ if (p && p->suspend) -+ ret = p->suspend(p); -+ else -+ return ret; -+ -+ if (!ret) -+ p->suspended = true; -+ else -+ pr_err("%s failed\n", __func__); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(pwrseq_suspend); -+ -+/** -+ * pwrseq_resume - Carry out power sequence resume for this pwrseq instance -+ * -+ * @pwrseq: the pwrseq instance -+ * -+ * This API is used to do resume operation on pwrseq instance. -+ * -+ * Return 0 on success, or an error value otherwise. -+ */ -+int pwrseq_resume(struct pwrseq *p) -+{ -+ int ret = 0; -+ -+ if (p && p->resume) -+ ret = p->resume(p); -+ else -+ return ret; -+ -+ if (!ret) -+ p->suspended = false; -+ else -+ pr_err("%s failed\n", __func__); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(pwrseq_resume); -+ -+/** -+ * pwrseq_suspend_list - Carry out power sequence suspend for list -+ * -+ * @head: the list head for pwrseq instance list on this bus -+ * -+ * This API is used to do suspend on all power sequence instances on this bus. -+ * The caller needs to use mutex_lock for concurrent. -+ */ -+int pwrseq_suspend_list(struct list_head *head) -+{ -+ struct pwrseq *pwrseq; -+ struct pwrseq_list_per_dev *pwrseq_list_node; -+ int ret = 0; -+ -+ list_for_each_entry(pwrseq_list_node, head, list) { -+ ret = pwrseq_suspend(pwrseq_list_node->pwrseq); -+ if (ret) -+ break; -+ } -+ -+ if (ret) { -+ list_for_each_entry(pwrseq_list_node, head, list) { -+ pwrseq = pwrseq_list_node->pwrseq; -+ if (pwrseq->suspended) -+ pwrseq_resume(pwrseq); -+ } -+ } -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(pwrseq_suspend_list); -+ -+/** -+ * pwrseq_resume_list - Carry out power sequence resume for the list -+ * -+ * @head: the list head for pwrseq instance list on this bus -+ * -+ * This API is used to do resume on all power sequence instances on this bus. -+ * The caller needs to use mutex_lock for concurrent. -+ */ -+int pwrseq_resume_list(struct list_head *head) -+{ -+ struct pwrseq_list_per_dev *pwrseq_list_node; -+ int ret = 0; -+ -+ list_for_each_entry(pwrseq_list_node, head, list) { -+ ret = pwrseq_resume(pwrseq_list_node->pwrseq); -+ if (ret) -+ break; -+ } -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(pwrseq_resume_list); -diff --git a/drivers/power/pwrseq/pwrseq_generic.c b/drivers/power/pwrseq/pwrseq_generic.c -new file mode 100644 -index 000000000000..b7bbd6c5b47d ---- /dev/null -+++ b/drivers/power/pwrseq/pwrseq_generic.c -@@ -0,0 +1,210 @@ -+/* -+ * pwrseq_generic.c Generic power sequence handling -+ * -+ * Copyright (C) 2016 Freescale Semiconductor, Inc. -+ * Author: Peter Chen <peter.chen@nxp.com> -+ * -+ * This program is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 of -+ * the License as published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program. -+ */ -+ -+#include <linux/clk.h> -+#include <linux/delay.h> -+#include <linux/gpio.h> -+#include <linux/gpio/consumer.h> -+#include <linux/of.h> -+#include <linux/of_gpio.h> -+#include <linux/slab.h> -+ -+#include <linux/power/pwrseq.h> -+ -+struct pwrseq_generic { -+ struct pwrseq pwrseq; -+ struct gpio_desc *gpiod_reset; -+ struct clk *clks[PWRSEQ_MAX_CLKS]; -+ u32 duration_us; -+ bool suspended; -+}; -+ -+#define to_generic_pwrseq(p) container_of(p, struct pwrseq_generic, pwrseq) -+ -+static int pwrseq_generic_suspend(struct pwrseq *pwrseq) -+{ -+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq); -+ int clk; -+ -+ for (clk = PWRSEQ_MAX_CLKS - 1; clk >= 0; clk--) -+ clk_disable_unprepare(pwrseq_gen->clks[clk]); -+ -+ pwrseq_gen->suspended = true; -+ return 0; -+} -+ -+static int pwrseq_generic_resume(struct pwrseq *pwrseq) -+{ -+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq); -+ int clk, ret = 0; -+ -+ for (clk = 0; clk < PWRSEQ_MAX_CLKS && pwrseq_gen->clks[clk]; clk++) { -+ ret = clk_prepare_enable(pwrseq_gen->clks[clk]); -+ if (ret) { -+ pr_err("Can't enable clock, ret=%d\n", ret); -+ goto err_disable_clks; -+ } -+ } -+ -+ pwrseq_gen->suspended = false; -+ return ret; -+ -+err_disable_clks: -+ while (--clk >= 0) -+ clk_disable_unprepare(pwrseq_gen->clks[clk]); -+ -+ return ret; -+} -+ -+static void pwrseq_generic_put(struct pwrseq *pwrseq) -+{ -+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq); -+ int clk; -+ -+ if (pwrseq_gen->gpiod_reset) -+ gpiod_put(pwrseq_gen->gpiod_reset); -+ -+ for (clk = 0; clk < PWRSEQ_MAX_CLKS; clk++) -+ clk_put(pwrseq_gen->clks[clk]); -+ -+ kfree(pwrseq_gen); -+} -+ -+static void pwrseq_generic_off(struct pwrseq *pwrseq) -+{ -+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq); -+ int clk; -+ -+ if (pwrseq_gen->suspended) -+ return; -+ -+ for (clk = PWRSEQ_MAX_CLKS - 1; clk >= 0; clk--) -+ clk_disable_unprepare(pwrseq_gen->clks[clk]); -+} -+ -+static int pwrseq_generic_on(struct pwrseq *pwrseq) -+{ -+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq); -+ int clk, ret = 0; -+ struct gpio_desc *gpiod_reset = pwrseq_gen->gpiod_reset; -+ -+ for (clk = 0; clk < PWRSEQ_MAX_CLKS && pwrseq_gen->clks[clk]; clk++) { -+ ret = clk_prepare_enable(pwrseq_gen->clks[clk]); -+ if (ret) { -+ pr_err("Can't enable clock, ret=%d\n", ret); -+ goto err_disable_clks; -+ } -+ } -+ -+ if (gpiod_reset) { -+ u32 duration_us = pwrseq_gen->duration_us; -+ -+ if (duration_us <= 10) -+ udelay(10); -+ else -+ usleep_range(duration_us, duration_us + 100); -+ gpiod_set_value(gpiod_reset, 0); -+ } -+ -+ return ret; -+ -+err_disable_clks: -+ while (--clk >= 0) -+ clk_disable_unprepare(pwrseq_gen->clks[clk]); -+ -+ return ret; -+} -+ -+static int pwrseq_generic_get(struct device_node *np, struct pwrseq *pwrseq) -+{ -+ struct pwrseq_generic *pwrseq_gen = to_generic_pwrseq(pwrseq); -+ enum of_gpio_flags flags; -+ int reset_gpio, clk, ret = 0; -+ -+ for (clk = 0; clk < PWRSEQ_MAX_CLKS; clk++) { -+ pwrseq_gen->clks[clk] = of_clk_get(np, clk); -+ if (IS_ERR(pwrseq_gen->clks[clk])) { -+ ret = PTR_ERR(pwrseq_gen->clks[clk]); -+ if (ret != -ENOENT) -+ goto err_put_clks; -+ pwrseq_gen->clks[clk] = NULL; -+ break; -+ } -+ } -+ -+ reset_gpio = of_get_named_gpio_flags(np, "reset-gpios", 0, &flags); -+ if (gpio_is_valid(reset_gpio)) { -+ unsigned long gpio_flags; -+ -+ if (flags & OF_GPIO_ACTIVE_LOW) -+ gpio_flags = GPIOF_ACTIVE_LOW | GPIOF_OUT_INIT_LOW; -+ else -+ gpio_flags = GPIOF_OUT_INIT_HIGH; -+ -+ ret = gpio_request_one(reset_gpio, gpio_flags, -+ "pwrseq-reset-gpios"); -+ if (ret) -+ goto err_put_clks; -+ -+ pwrseq_gen->gpiod_reset = gpio_to_desc(reset_gpio); -+ of_property_read_u32(np, "reset-duration-us", -+ &pwrseq_gen->duration_us); -+ } else if (reset_gpio == -ENOENT) { -+ ; /* no such gpio */ -+ } else { -+ ret = reset_gpio; -+ pr_err("Failed to get reset gpio on %s, err = %d\n", -+ np->full_name, reset_gpio); -+ goto err_put_clks; -+ } -+ -+ return 0; -+ -+err_put_clks: -+ while (--clk >= 0) -+ clk_put(pwrseq_gen->clks[clk]); -+ return ret; -+} -+ -+/** -+ * pwrseq_generic_alloc_instance - power sequence instance allocation -+ * -+ * This function is used to allocate one generic power sequence instance, -+ * it is called when the system boots up and after one power sequence -+ * instance is got successfully. -+ * -+ * Return zero on success or an error code otherwise. -+ */ -+struct pwrseq *pwrseq_generic_alloc_instance(void) -+{ -+ struct pwrseq_generic *pwrseq_gen; -+ -+ pwrseq_gen = kzalloc(sizeof(*pwrseq_gen), GFP_KERNEL); -+ if (!pwrseq_gen) -+ return ERR_PTR(-ENOMEM); -+ -+ pwrseq_gen->pwrseq.get = pwrseq_generic_get; -+ pwrseq_gen->pwrseq.on = pwrseq_generic_on; -+ pwrseq_gen->pwrseq.off = pwrseq_generic_off; -+ pwrseq_gen->pwrseq.put = pwrseq_generic_put; -+ pwrseq_gen->pwrseq.suspend = pwrseq_generic_suspend; -+ pwrseq_gen->pwrseq.resume = pwrseq_generic_resume; -+ -+ return &pwrseq_gen->pwrseq; -+} -diff --git a/include/linux/power/pwrseq.h b/include/linux/power/pwrseq.h -new file mode 100644 -index 000000000000..c5b278f5f2ae ---- /dev/null -+++ b/include/linux/power/pwrseq.h -@@ -0,0 +1,84 @@ -+#ifndef __LINUX_PWRSEQ_H -+#define __LINUX_PWRSEQ_H -+ -+#include <linux/of.h> -+ -+#define PWRSEQ_MAX_CLKS 3 -+ -+/** -+ * struct pwrseq - the power sequence structure -+ * @pwrseq_of_match_table: the OF device id table this pwrseq library supports -+ * @node: the list pointer to be added to pwrseq list -+ * @get: the API is used to get pwrseq instance from the device node -+ * @on: do power on for this pwrseq instance -+ * @off: do power off for this pwrseq instance -+ * @put: release the resources on this pwrseq instance -+ * @suspend: do suspend operation on this pwrseq instance -+ * @resume: do resume operation on this pwrseq instance -+ */ -+struct pwrseq { -+ const struct of_device_id *pwrseq_of_match_table; -+ struct list_head node; -+ int (*get)(struct device_node *np, struct pwrseq *p); -+ int (*on)(struct pwrseq *p); -+ void (*off)(struct pwrseq *p); -+ void (*put)(struct pwrseq *p); -+ int (*suspend)(struct pwrseq *p); -+ int (*resume)(struct pwrseq *p); -+ bool suspended; -+}; -+ -+/* used for power sequence instance list in one driver */ -+struct pwrseq_list_per_dev { -+ struct pwrseq *pwrseq; -+ struct list_head list; -+}; -+ -+#if IS_ENABLED(CONFIG_POWER_SEQUENCE) -+struct pwrseq *of_pwrseq_on(struct device_node *np); -+void of_pwrseq_off(struct pwrseq *pwrseq); -+int of_pwrseq_on_list(struct device_node *np, struct list_head *head); -+void of_pwrseq_off_list(struct list_head *head); -+int pwrseq_suspend(struct pwrseq *p); -+int pwrseq_resume(struct pwrseq *p); -+int pwrseq_suspend_list(struct list_head *head); -+int pwrseq_resume_list(struct list_head *head); -+#else -+static inline struct pwrseq *of_pwrseq_on(struct device_node *np) -+{ -+ return NULL; -+} -+static void of_pwrseq_off(struct pwrseq *pwrseq) {} -+static int of_pwrseq_on_list(struct device_node *np, struct list_head *head) -+{ -+ return 0; -+} -+static void of_pwrseq_off_list(struct list_head *head) {} -+static int pwrseq_suspend(struct pwrseq *p) -+{ -+ return 0; -+} -+static int pwrseq_resume(struct pwrseq *p) -+{ -+ return 0; -+} -+static int pwrseq_suspend_list(struct list_head *head) -+{ -+ return 0; -+} -+static int pwrseq_resume_list(struct list_head *head) -+{ -+ return 0; -+} -+#endif /* CONFIG_POWER_SEQUENCE */ -+ -+#if IS_ENABLED(CONFIG_PWRSEQ_GENERIC) -+extern struct pwrseq *pwrseq_generic_alloc_instance(void); -+#else -+static inline struct pwrseq *pwrseq_generic_alloc_instance(void) -+{ -+ return ERR_PTR(-ENOTSUPP); -+} -+#endif /* CONFIG_PWRSEQ_GENERIC */ -+ -+#endif /* __LINUX_PWRSEQ_H */ --- -2.18.0 - diff --git a/libre/linux-libre-pck/0010-usb-core-add-power-sequence-handling-for-USB-devices.patch b/libre/linux-libre-pck/0010-usb-core-add-power-sequence-handling-for-USB-devices.patch deleted file mode 100644 index ddebef4f0..000000000 --- a/libre/linux-libre-pck/0010-usb-core-add-power-sequence-handling-for-USB-devices.patch +++ /dev/null @@ -1,164 +0,0 @@ -From 1358757f34c7feff4aab541814c73f6cf3e83b69 Mon Sep 17 00:00:00 2001 -From: Peter Chen <peter.chen@nxp.com> -Date: Wed, 21 Jun 2017 14:42:05 +0800 -Subject: [PATCH 10/14] usb: core: add power sequence handling for USB devices - -Some hard-wired USB devices need to do power sequence to let the -device work normally, the typical power sequence like: enable USB -PHY clock, toggle reset pin, etc. But current Linux USB driver -lacks of such code to do it, it may cause some hard-wired USB devices -works abnormal or can't be recognized by controller at all. - -In this patch, it calls power sequence library APIs to finish -the power sequence events. It will do power on sequence at hub's -probe for all devices under this hub (includes root hub). -At hub_disconnect, it will do power off sequence which is at powered -on list. - -Signed-off-by: Peter Chen <peter.chen@nxp.com> -Tested-by Joshua Clayton <stillcompiling@gmail.com> -Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name> -Reviewed-by: Vaibhav Hiremath <hvaibhav.linux@gmail.com> -Acked-by: Alan Stern <stern@rowland.harvard.edu> ---- - drivers/usb/Kconfig | 1 + - drivers/usb/core/hub.c | 49 ++++++++++++++++++++++++++++++++++++++---- - drivers/usb/core/hub.h | 1 + - 3 files changed, 47 insertions(+), 4 deletions(-) - -diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig -index 987fc5ba6321..bd09fc8ff763 100644 ---- a/drivers/usb/Kconfig -+++ b/drivers/usb/Kconfig -@@ -45,6 +45,7 @@ config USB - tristate "Support for Host-side USB" - depends on USB_ARCH_HAS_HCD - select USB_COMMON -+ select POWER_SEQUENCE - select NLS # for UTF-8 strings - ---help--- - Universal Serial Bus (USB) is a specification for a serial bus -diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c -index fcae521df29b..0c708d3ef179 100644 ---- a/drivers/usb/core/hub.c -+++ b/drivers/usb/core/hub.c -@@ -28,6 +28,7 @@ - #include <linux/mutex.h> - #include <linux/random.h> - #include <linux/pm_qos.h> -+#include <linux/power/pwrseq.h> - - #include <linux/uaccess.h> - #include <asm/byteorder.h> -@@ -1654,6 +1655,7 @@ static void hub_disconnect(struct usb_interface *intf) - hub->error = 0; - hub_quiesce(hub, HUB_DISCONNECT); - -+ of_pwrseq_off_list(&hub->pwrseq_list); - mutex_lock(&usb_port_peer_mutex); - - /* Avoid races with recursively_mark_NOTATTACHED() */ -@@ -1700,11 +1702,41 @@ static bool hub_descriptor_is_sane(struct usb_host_interface *desc) - return true; - } - -+#ifdef CONFIG_OF -+static int hub_of_pwrseq_on(struct usb_hub *hub) -+{ -+ struct device *parent; -+ struct usb_device *hdev = hub->hdev; -+ struct device_node *np; -+ int ret; -+ -+ if (hdev->parent) -+ parent = &hdev->dev; -+ else -+ parent = bus_to_hcd(hdev->bus)->self.sysdev; -+ -+ for_each_child_of_node(parent->of_node, np) { -+ ret = of_pwrseq_on_list(np, &hub->pwrseq_list); -+ /* Maybe no power sequence library is chosen */ -+ if (ret && ret != -ENOENT) -+ return ret; -+ } -+ -+ return 0; -+} -+#else -+static int hub_of_pwrseq_on(struct usb_hub *hub) -+{ -+ return 0; -+} -+#endif -+ - static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) - { - struct usb_host_interface *desc; - struct usb_device *hdev; - struct usb_hub *hub; -+ int ret = -ENODEV; - - desc = intf->cur_altsetting; - hdev = interface_to_usbdev(intf); -@@ -1795,6 +1827,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) - INIT_DELAYED_WORK(&hub->leds, led_work); - INIT_DELAYED_WORK(&hub->init_work, NULL); - INIT_WORK(&hub->events, hub_event); -+ INIT_LIST_HEAD(&hub->pwrseq_list); - usb_get_intf(intf); - usb_get_dev(hdev); - -@@ -1808,11 +1841,14 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) - if (id->driver_info & HUB_QUIRK_CHECK_PORT_AUTOSUSPEND) - hub->quirk_check_port_auto_suspend = 1; - -- if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) -- return 0; -+ if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) { -+ ret = hub_of_pwrseq_on(hub); -+ if (!ret) -+ return 0; -+ } - - hub_disconnect(intf); -- return -ENODEV; -+ return ret; - } - - static int -@@ -3653,14 +3689,19 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) - - /* stop hub_wq and related activity */ - hub_quiesce(hub, HUB_SUSPEND); -- return 0; -+ return pwrseq_suspend_list(&hub->pwrseq_list); - } - - static int hub_resume(struct usb_interface *intf) - { - struct usb_hub *hub = usb_get_intfdata(intf); -+ int ret; - - dev_dbg(&intf->dev, "%s\n", __func__); -+ ret = pwrseq_resume_list(&hub->pwrseq_list); -+ if (ret) -+ return ret; -+ - hub_activate(hub, HUB_RESUME); - return 0; - } -diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h -index 4accfb63f7dc..abe71c5e84cb 100644 ---- a/drivers/usb/core/hub.h -+++ b/drivers/usb/core/hub.h -@@ -70,6 +70,7 @@ struct usb_hub { - struct delayed_work init_work; - struct work_struct events; - struct usb_port **ports; -+ struct list_head pwrseq_list; /* powered pwrseq node list */ - }; - - /** --- -2.18.0 - diff --git a/libre/linux-libre-pck/0011-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch b/libre/linux-libre-pck/0011-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch deleted file mode 100644 index f5f920626..000000000 --- a/libre/linux-libre-pck/0011-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 0b61e501bdfb883df4211fdc47d246df6af06e5a Mon Sep 17 00:00:00 2001 -From: Joshua Clayton <stillcompiling@gmail.com> -Date: Wed, 21 Jun 2017 14:42:06 +0800 -Subject: [PATCH 11/14] ARM: dts: imx6qdl: Enable usb node children with <reg> - -Give usb nodes #address and #size attributes, so that a child node -representing a permanently connected device such as an onboard hub may -be addressed with a <reg> attribute - -Signed-off-by: Joshua Clayton <stillcompiling@gmail.com> -Signed-off-by: Peter Chen <peter.chen@nxp.com> ---- - arch/arm/boot/dts/imx6qdl.dtsi | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi -index 911141e24681..c74e9c7a83bf 100644 ---- a/arch/arm/boot/dts/imx6qdl.dtsi -+++ b/arch/arm/boot/dts/imx6qdl.dtsi -@@ -965,6 +965,8 @@ - - usbh1: usb@2184200 { - compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; -+ #address-cells = <1>; -+ #size-cells = <0>; - reg = <0x02184200 0x200>; - interrupts = <0 40 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&clks IMX6QDL_CLK_USBOH3>; -@@ -979,6 +981,8 @@ - - usbh2: usb@2184400 { - compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; -+ #address-cells = <1>; -+ #size-cells = <0>; - reg = <0x02184400 0x200>; - interrupts = <0 41 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&clks IMX6QDL_CLK_USBOH3>; -@@ -992,6 +996,8 @@ - - usbh3: usb@2184600 { - compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; -+ #address-cells = <1>; -+ #size-cells = <0>; - reg = <0x02184600 0x200>; - interrupts = <0 42 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&clks IMX6QDL_CLK_USBOH3>; --- -2.18.0 - diff --git a/libre/linux-libre-pck/0012-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch b/libre/linux-libre-pck/0012-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch deleted file mode 100644 index 6f8d546d4..000000000 --- a/libre/linux-libre-pck/0012-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 3e35057ab8b11c232a7c0edeea3299d53c6d600d Mon Sep 17 00:00:00 2001 -From: Peter Chen <peter.chen@nxp.com> -Date: Wed, 21 Jun 2017 14:42:07 +0800 -Subject: [PATCH 12/14] ARM: dts: imx6qdl-udoo.dtsi: fix onboard USB HUB - property - -The current dts describes USB HUB's property at USB controller's -entry, it is improper. The USB HUB should be the child node -under USB controller, and power sequence properties are under -it. Besides, using gpio pinctrl setting for USB2415's reset pin. - -Signed-off-by: Peter Chen <peter.chen@nxp.com> -Signed-off-by: Joshua Clayton <stillcompiling@gmail.com> -Tested-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name> ---- - arch/arm/boot/dts/imx6qdl-udoo.dtsi | 26 ++++++++++++-------------- - 1 file changed, 12 insertions(+), 14 deletions(-) - -diff --git a/arch/arm/boot/dts/imx6qdl-udoo.dtsi b/arch/arm/boot/dts/imx6qdl-udoo.dtsi -index 4f27861bbb32..dead14b0d4bf 100644 ---- a/arch/arm/boot/dts/imx6qdl-udoo.dtsi -+++ b/arch/arm/boot/dts/imx6qdl-udoo.dtsi -@@ -5,6 +5,8 @@ - * Author: Fabio Estevam <fabio.estevam@freescale.com> - */ - -+#include <dt-bindings/gpio/gpio.h> -+ - / { - aliases { - backlight = &backlight; -@@ -61,17 +63,6 @@ - #address-cells = <1>; - #size-cells = <0>; - -- reg_usb_h1_vbus: regulator@0 { -- compatible = "regulator-fixed"; -- reg = <0>; -- regulator-name = "usb_h1_vbus"; -- regulator-min-microvolt = <5000000>; -- regulator-max-microvolt = <5000000>; -- enable-active-high; -- startup-delay-us = <2>; /* USB2415 requires a POR of 1 us minimum */ -- gpio = <&gpio7 12 0>; -- }; -- - reg_panel: regulator@1 { - compatible = "regulator-fixed"; - reg = <1>; -@@ -197,7 +188,7 @@ - - pinctrl_usbh: usbhgrp { - fsl,pins = < -- MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x80000000 -+ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x1b0b0 - MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x130b0 - >; - }; -@@ -268,9 +259,16 @@ - &usbh1 { - pinctrl-names = "default"; - pinctrl-0 = <&pinctrl_usbh>; -- vbus-supply = <®_usb_h1_vbus>; -- clocks = <&clks IMX6QDL_CLK_CKO>; - status = "okay"; -+ -+ usb2415: hub@1 { -+ compatible = "usb424,2514"; -+ reg = <1>; -+ -+ clocks = <&clks IMX6QDL_CLK_CKO>; -+ reset-gpios = <&gpio7 12 GPIO_ACTIVE_LOW>; -+ reset-duration-us = <3000>; -+ }; - }; - - &usdhc3 { --- -2.18.0 - diff --git a/libre/linux-libre-pck/0013-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch b/libre/linux-libre-pck/0013-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch deleted file mode 100644 index 31023b56b..000000000 --- a/libre/linux-libre-pck/0013-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 9d40728e452daf4d77f8924e499814138dc5363c Mon Sep 17 00:00:00 2001 -From: Joshua Clayton <stillcompiling@gmail.com> -Date: Wed, 21 Jun 2017 14:42:08 +0800 -Subject: [PATCH 13/14] ARM: dts: imx6q-evi: Fix onboard hub reset line - -Previously the onboard hub was made to work by treating its -reset gpio as a regulator enable. -Get rid of that kludge now that pwseq has added reset gpio support -Move pin muxing the hub reset pin into the usbh1 group - -Signed-off-by: Joshua Clayton <stillcompiling@gmail.com> -Signed-off-by: Peter Chen <peter.chen@nxp.com> ---- - arch/arm/boot/dts/imx6q-evi.dts | 25 +++++++------------------ - 1 file changed, 7 insertions(+), 18 deletions(-) - -diff --git a/arch/arm/boot/dts/imx6q-evi.dts b/arch/arm/boot/dts/imx6q-evi.dts -index fcd257bc5ac3..d32fa81bba95 100644 ---- a/arch/arm/boot/dts/imx6q-evi.dts -+++ b/arch/arm/boot/dts/imx6q-evi.dts -@@ -54,18 +54,6 @@ - reg = <0x10000000 0x40000000>; - }; - -- reg_usbh1_vbus: regulator-usbhubreset { -- compatible = "regulator-fixed"; -- regulator-name = "usbh1_vbus"; -- regulator-min-microvolt = <5000000>; -- regulator-max-microvolt = <5000000>; -- enable-active-high; -- startup-delay-us = <2>; -- pinctrl-names = "default"; -- pinctrl-0 = <&pinctrl_usbh1_hubreset>; -- gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>; -- }; -- - reg_usb_otg_vbus: regulator-usbotgvbus { - compatible = "regulator-fixed"; - regulator-name = "usb_otg_vbus"; -@@ -213,12 +201,18 @@ - }; - - &usbh1 { -- vbus-supply = <®_usbh1_vbus>; - pinctrl-names = "default"; - pinctrl-0 = <&pinctrl_usbh1>; - dr_mode = "host"; - disable-over-current; - status = "okay"; -+ -+ usb2415host: hub@1 { -+ compatible = "usb424,2513"; -+ reg = <1>; -+ reset-gpios = <&gpio7 12 GPIO_ACTIVE_LOW>; -+ reset-duration-us = <3000>; -+ }; - }; - - &usbotg { -@@ -481,11 +475,6 @@ - MX6QDL_PAD_GPIO_3__USB_H1_OC 0x1b0b0 - /* usbh1_b OC */ - MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x1b0b0 -- >; -- }; -- -- pinctrl_usbh1_hubreset: usbh1hubresetgrp { -- fsl,pins = < - MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x1b0b0 - >; - }; --- -2.18.0 - diff --git a/libre/linux-libre-pck/0014-ARM-mvebu-declare-asm-symbols-as-character-arrays-in.patch b/libre/linux-libre-pck/0014-ARM-mvebu-declare-asm-symbols-as-character-arrays-in.patch deleted file mode 100644 index d18e2dd8e..000000000 --- a/libre/linux-libre-pck/0014-ARM-mvebu-declare-asm-symbols-as-character-arrays-in.patch +++ /dev/null @@ -1,61 +0,0 @@ -From a877c2568fc96a7a7ba89dd4cf0df20341df2a37 Mon Sep 17 00:00:00 2001 -From: Ethan Tuttle <ethan@ethantuttle.com> -Date: Tue, 19 Jun 2018 21:31:08 -0700 -Subject: [PATCH 14/14] ARM: mvebu: declare asm symbols as character arrays in - pmsu.c - -With CONFIG_FORTIFY_SOURCE, memcpy uses the declared size of operands to -detect buffer overflows. If src or dest is declared as a char, attempts to -copy more than byte will result in a fortify_panic(). - -Address this problem in mvebu_setup_boot_addr_wa() by declaring -mvebu_boot_wa_start and mvebu_boot_wa_end as character arrays. Also remove -a couple addressof operators to avoid "arithmetic on pointer to an -incomplete type" compiler error. - -See commit 54a7d50b9205 ("x86: mark kprobe templates as character arrays, -not single characters") for a similar fix. - -Fixes "detected buffer overflow in memcpy" error during init on some mvebu -systems (armada-370-xp, armada-375): - -(fortify_panic) from (mvebu_setup_boot_addr_wa+0xb0/0xb4) -(mvebu_setup_boot_addr_wa) from (mvebu_v7_cpu_pm_init+0x154/0x204) -(mvebu_v7_cpu_pm_init) from (do_one_initcall+0x7c/0x1a8) -(do_one_initcall) from (kernel_init_freeable+0x1bc/0x254) -(kernel_init_freeable) from (kernel_init+0x8/0x114) -(kernel_init) from (ret_from_fork+0x14/0x2c) - -Signed-off-by: Ethan Tuttle <ethan@ethantuttle.com> -Tested-by: Ethan Tuttle <ethan@ethantuttle.com> ---- - arch/arm/mach-mvebu/pmsu.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c -index 27a78c80e5b1..73d5d72dfc3e 100644 ---- a/arch/arm/mach-mvebu/pmsu.c -+++ b/arch/arm/mach-mvebu/pmsu.c -@@ -116,8 +116,8 @@ void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr) - PMSU_BOOT_ADDR_REDIRECT_OFFSET(hw_cpu)); - } - --extern unsigned char mvebu_boot_wa_start; --extern unsigned char mvebu_boot_wa_end; -+extern unsigned char mvebu_boot_wa_start[]; -+extern unsigned char mvebu_boot_wa_end[]; - - /* - * This function sets up the boot address workaround needed for SMP -@@ -130,7 +130,7 @@ int mvebu_setup_boot_addr_wa(unsigned int crypto_eng_target, - phys_addr_t resume_addr_reg) - { - void __iomem *sram_virt_base; -- u32 code_len = &mvebu_boot_wa_end - &mvebu_boot_wa_start; -+ u32 code_len = mvebu_boot_wa_end - mvebu_boot_wa_start; - - mvebu_mbus_del_window(BOOTROM_BASE, BOOTROM_SIZE); - mvebu_mbus_add_window_by_id(crypto_eng_target, crypto_eng_attribute, --- -2.18.0 - diff --git a/libre/linux-libre-pck/PKGBUILD b/libre/linux-libre-pck/PKGBUILD index d877137d5..13b5d9b19 100644 --- a/libre/linux-libre-pck/PKGBUILD +++ b/libre/linux-libre-pck/PKGBUILD @@ -11,7 +11,7 @@ pkgbase=linux-libre-pck _srcbasever=4.18-gnu -_srcver=4.18.7-gnu +_srcver=4.18.9-gnu _pckver=pck1 _replacesarchkernel=('linux-zen') @@ -22,7 +22,6 @@ _srcname=linux-${_srcbasever%-*} _archpkgver=${_srcver%-*} pkgver=${_srcver//-/.${_pckver}_} pkgrel=1 -rcnrel=armv7-x7 arch=(i686 x86_64 armv7h) url="https://wiki.parabola.nu/PCK" license=(GPL2) @@ -32,31 +31,12 @@ source=( "https://linux-libre.fsfla.org/pub/linux-libre/releases/$_srcbasever/linux-libre-$_srcbasever.tar.xz"{,.sign} "https://linux-libre.fsfla.org/pub/linux-libre/releases/$_srcver/patch-$_srcbasever-$_srcver.xz"{,.sign} "https://repo.parabola.nu/other/pck/patches/$_srcver/patch-$_srcver-$_pckver.patch"{,.sig} - "https://repo.parabola.nu/other/linux-libre/logos/logo_linux_clut224.ppm"{,.sig} - "https://repo.parabola.nu/other/linux-libre/logos/logo_linux_mono.pbm"{,.sig} - "https://repo.parabola.nu/other/linux-libre/logos/logo_linux_vga16.ppm"{,.sig} # the main kernel config files 'config.i686' 'config.x86_64' 'config.armv7h' # pacman hooks for depmod and initramfs regeneration '60-linux.hook' '90-linux.hook' # standard config files for mkinitcpio ramdisk 'linux.preset' - # armv7h patches - "https://repo.parabola.nu/other/rcn-libre/patches/${_srcver%-*}/rcn-libre-${_srcver%-*}-$rcnrel.patch"{,.sig} - '0001-ARM-atags-add-support-for-Marvell-s-u-boot.patch' - '0002-ARM-atags-fdt-retrieve-MAC-addresses-from-Marvell-bo.patch' - '0003-SMILE-Plug-device-tree-file.patch' - '0004-fix-mvsdio-eMMC-timing.patch' - '0005-net-smsc95xx-Allow-mac-address-to-be-set-as-a-parame.patch' - '0006-set-default-cubietruck-led-triggers.patch' - '0007-exynos4412-odroid-set-higher-minimum-buck2-regulator.patch' - '0008-ARM-dove-enable-ethernet-on-D3Plug.patch' - '0009-power-add-power-sequence-library.patch' - '0010-usb-core-add-power-sequence-handling-for-USB-devices.patch' - '0011-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch' - '0012-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch' - '0013-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch' - '0014-ARM-mvebu-declare-asm-symbols-as-character-arrays-in.patch' ) validpgpkeys=( '474402C8C582DAFBE389C427BCB7CF877E7D47A7' # Alexandre Oliva @@ -64,38 +44,16 @@ validpgpkeys=( ) sha512sums=('0c221c6e84eb5bc270ef79454bf407079daed84534afb1d449d40fa46e42868a471d3063016a4eb3f68d42879e18ee314ab30716116805fee35b5084b23df2a9' 'SKIP' - 'eb6ac128ed56fa9a499e32939d71d2c4f3afa3c064882c34222c6ac23e2ea0f323155a400525e007093ff9313045c677fbc2f9487d42fd4c3b23a09d8454991f' + '72486a515539b2420daa6fb41c41f5994dbc4572bdacd80f75fb965398b6e12ed06c491ddab263adc36c5d48da52e1b5cf1145f4f808665dffc64ba16bfc90d4' 'SKIP' - '16bd5ea296c2ce1045ade8e85dd8d073575e480f499630cad9a1c4a3b71b8b812c1b80efec9f2e3c8aaa0d4d42d446bb1499617cbc38a07d45110ee853f20cb5' + '820b2e4d6e13152817674870b787af62425d2bdb9d2555b82334238b48500f7e0201a2ddc01f6db2a34008a5ba241f548cffe751876069cc7ff1ff986f6d05ab' 'SKIP' - '13cb5bc42542e7b8bb104d5f68253f6609e463b6799800418af33eb0272cc269aaa36163c3e6f0aacbdaaa1d05e2827a4a7c4a08a029238439ed08b89c564bb3' - 'SKIP' - '267295aa0cea65684968420c68b32f1a66a22d018b9d2b2c1ef14267bcf4cb68aaf7099d073cbfefe6c25c8608bdcbbd45f7ac8893fdcecbf1e621abdfe9ecc1' - 'SKIP' - '7a3716bfe3b9f546da309c7492f3e08f8f506813afeb1c737a474c83313d5c313cf4582b65215c2cfce3b74d9d1021c96e8badafe8f6e5b01fe28d2b5c61ae78' - 'SKIP' - '0168a5c4ac87199a9e9312164e38492d4d7dfc1bceb8cae4ad4024b60fb6d4f9e7fe5615027826e8ca4b11fd33d78610b138a86059744f1ebf50b11c1316a2a7' - '5082962fd5d3af17e584198cf7731d40f4bd2f31dd7ebc5235bc19905fa7715d30c07be9a8f8efa29883124e2b54639ba4a5d6b3dd1e2eee4f7cf2ff77230cb0' - 'fb2a6268dad39d2a84f90e90af31e133fb7c7bd0a20c9e82c7badcfab452b387ad51a0f13d885c6355dc869984385f42e5147a283b27dcc7af291794163c2883' + '8a10ff5806923acf49fa286a8060b892767398a3da5b7b8ff12a9904e6576e23d346519ef5dfaa1cd7e8c8fdb3a8e573968d30343e025362dd6b7fb2c72fec3c' + '7279a753afbbc7eedb5a5d4d98ed6300ef1014ae4666367a3a1040c6bd45c13c84bc187f90f9b04c9a32d6b6032319b42bf48dc650522c2fde1262891a121941' + 'a786de70e1e7106e26bec8afd67bc6a18c6124c6e3bfa9f7d1a794f1b0bce9b095e1806e79583a8c4f2e90424370fdafba77bed93215e62239fb4eda5dae257a' '7ad5be75ee422dda3b80edd2eb614d8a9181e2c8228cd68b3881e2fb95953bf2dea6cbe7900ce1013c9de89b2802574b7b24869fc5d7a95d3cc3112c4d27063a' '4a8b324aee4cccf3a512ad04ce1a272d14e5b05c8de90feb82075f55ea3845948d817e1b0c6f298f5816834ddd3e5ce0a0e2619866289f3c1ab8fd2f35f04f44' - '2dc6b0ba8f7dbf19d2446c5c5f1823587de89f4e28e9595937dd51a87755099656f2acec50e3e2546ea633ad1bfd1c722e0c2b91eef1d609103d8abdc0a7cbaf' - '41d00af3409e8ae91aa0423ef73a5d4c5ed4ba4e2244ef37d8b8a3c8d4e379c26e45fef21274d8e2c795ef545a3212b735fc1b5b5a8b6338c8a72ca29c5167c0' - 'SKIP' - '8a12b4477f716214266b83785335515bc0d1b1ee5c728803945e0db613caca2df02939a681716cbb51039f9a003c7e7048d882271691fd8c20f273a4a8b78f01' - '47838b54f76595fd0dda8699bccf55aeefbe9031da965b50fadf2a8f8bb34c2e12b8c4b29cca5f6e6b3ce2704464dc1966565185641ab1b64ce2575591a79de7' - '067ed33621353496c19b88746b9b1ab875e8a1bde3954f4aa4e8c353389e0d15551e4edaa173e98f8dfe48877b7edec40abc68f423511dcaf5db81d998560acf' - 'cec08c029509c6c07f1addb6ac1338b61ded296eac5dd3d66449429090ae0743a09cf93d8da46082784e463ee44d42fea669d362cec8ef36aa0527a0a20f1271' - '4cd1491b69a130f7e0a2bf93c542f962e50ed2b727a96b71bfe5c2444db1abf5dba559135feecc3c02e122f717a71982d73f7432fefa9da309ce2406add591e5' - '796e6808297a9e037c9a8912d796347f83d2c17e0162920a792216e3d6ef0e860a93c1a2c41797f1fa59cbbcaa2ace7a088ebc36dcb699ee17b95a47e39f2dda' - '41a5f8d2fd1d82fac38afb8b15631d35d9a15f779cf60963943af2807b8caf40461e212bd0081b46dd39e08d3a4ad94910700ab4bee8460fe99d725a22f7b1e2' - 'e18ab92d1c4fcc9782ad9fdb456d3be397e17f9ec5e897242ba891c9cbb738bc616981447a7593bb907c5dd231035b000282e0e6f522cd6921a200d3b089aec8' - '85551c55a66885d765808ceb2c7f31cd911ec7c42212a7801883cee35881171de4d26d053d6c62cbec4474c437061e05ac5857b5038e64b7c14e7df3bb5985b1' - 'a690b4ae030fe9657b2629bbe8d38b74415db06f293d0413c74b5ef88f85693f61926ff9b83fbd099ae25a11bf03b9f7cdf947ae2c52434282b3a583b280d78c' - '28d26ca6ffc095cac0574fadb7621ea0674d542deee3bb03d251ee3a6597107002cd24d88850ca9e0a987438c86b4c61b0d146d09f29bf57ca21f04e733b6865' - 'e1b00e33bcdbc663041df21a2fa84743eebaf904204ea9b7458e4dde7bc61b17faa22c09038283e26291458427ebd9a53bf463b1bc8bc28d147d1a186426b232' - 'c3a3ceed29b8513f478cad877507c7d2171453d24346c4d62ebf34c3f35ed13ebce2ca6f7200e97693ea900f504528685fe5b59c641ccfe36bc9bc257106f157' - '073c48fea2989334451b9020e8151c0385b07affcb2bc5f778fd5f9d2d8182e40dcd04edde4d53648c1ed8cea4721afc04267a72e429be3612d2f77f5d0fd459') + '2dc6b0ba8f7dbf19d2446c5c5f1823587de89f4e28e9595937dd51a87755099656f2acec50e3e2546ea633ad1bfd1c722e0c2b91eef1d609103d8abdc0a7cbaf') _kernelname=${pkgbase#linux-libre} _replacesarchkernel=("${_replacesarchkernel[@]/\%/${_kernelname}}") @@ -118,34 +76,6 @@ prepare() { # add PCK patch patch -p1 -i ../patch-$_srcver-$_pckver.patch - if [ "$CARCH" = "armv7h" ]; then - # RCN patch (CM3 firmware deblobbed and AUFS/WireGuard removed) - # Note: For stability reasons, AUFS has been removed in the RCN patch. - # We are supporting AUFS in linux-libre-pck through PCK patch. - # See https://wiki.parabola.nu/PCK for further details. - patch -p1 -i ../rcn-libre-${_srcver%-*}-$rcnrel.patch - - # ALARM patches - patch -p1 -i ../0001-ARM-atags-add-support-for-Marvell-s-u-boot.patch - patch -p1 -i ../0002-ARM-atags-fdt-retrieve-MAC-addresses-from-Marvell-bo.patch - patch -p1 -i ../0003-SMILE-Plug-device-tree-file.patch - patch -p1 -i ../0004-fix-mvsdio-eMMC-timing.patch - patch -p1 -i ../0005-net-smsc95xx-Allow-mac-address-to-be-set-as-a-parame.patch - patch -p1 -i ../0006-set-default-cubietruck-led-triggers.patch - patch -p1 -i ../0007-exynos4412-odroid-set-higher-minimum-buck2-regulator.patch - patch -p1 -i ../0008-ARM-dove-enable-ethernet-on-D3Plug.patch - patch -p1 -i ../0009-power-add-power-sequence-library.patch - patch -p1 -i ../0010-usb-core-add-power-sequence-handling-for-USB-devices.patch - patch -p1 -i ../0011-ARM-dts-imx6qdl-Enable-usb-node-children-with-reg.patch - patch -p1 -i ../0012-ARM-dts-imx6qdl-udoo.dtsi-fix-onboard-USB-HUB-proper.patch - patch -p1 -i ../0013-ARM-dts-imx6q-evi-Fix-onboard-hub-reset-line.patch - patch -p1 -i ../0014-ARM-mvebu-declare-asm-symbols-as-character-arrays-in.patch - fi - - # add freedo as boot logo - install -m644 -t drivers/video/logo \ - ../logo_linux_{clut224.ppm,vga16.ppm,mono.pbm} - msg2 "Setting version..." scripts/setlocalversion --save-scmversion echo "-$pkgrel" > localversion.10-pkgrel diff --git a/libre/linux-libre-pck/config.armv7h b/libre/linux-libre-pck/config.armv7h index 06b4b0006..75f506ec3 100644 --- a/libre/linux-libre-pck/config.armv7h +++ b/libre/linux-libre-pck/config.armv7h @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 4.18.7-gnu-pck1 Kernel Configuration +# Linux/arm 4.18.9-gnu-pck1 Kernel Configuration # # @@ -59,7 +59,7 @@ CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_CROSS_MEMORY_ATTACH=y -CONFIG_USELIB=y +# CONFIG_USELIB is not set CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y diff --git a/libre/linux-libre-pck/config.i686 b/libre/linux-libre-pck/config.i686 index 7270468dc..53fd5993d 100644 --- a/libre/linux-libre-pck/config.i686 +++ b/libre/linux-libre-pck/config.i686 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 4.18.7-gnu-pck1 Kernel Configuration +# Linux/x86 4.18.9-gnu-pck1 Kernel Configuration # # @@ -1155,14 +1155,14 @@ CONFIG_NF_NAT_REDIRECT=y CONFIG_NETFILTER_SYNPROXY=m CONFIG_NF_OSF=m CONFIG_NF_TABLES=m -# CONFIG_NF_TABLES_SET is not set +CONFIG_NF_TABLES_SET=m CONFIG_NF_TABLES_INET=y CONFIG_NF_TABLES_NETDEV=y CONFIG_NFT_NUMGEN=m CONFIG_NFT_CT=m CONFIG_NFT_FLOW_OFFLOAD=m CONFIG_NFT_COUNTER=m -# CONFIG_NFT_CONNLIMIT is not set +CONFIG_NFT_CONNLIMIT=m CONFIG_NFT_LOG=m CONFIG_NFT_LIMIT=m CONFIG_NFT_MASQ=m @@ -1177,7 +1177,7 @@ CONFIG_NFT_COMPAT=m CONFIG_NFT_HASH=m CONFIG_NFT_FIB=m CONFIG_NFT_FIB_INET=m -# CONFIG_NFT_SOCKET is not set +CONFIG_NFT_SOCKET=m CONFIG_NF_DUP_NETDEV=m CONFIG_NFT_DUP_NETDEV=m CONFIG_NFT_FWD_NETDEV=m @@ -4239,6 +4239,7 @@ CONFIG_GPIO_ACPI=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y +# CONFIG_GPIO_OF_HELPER is not set CONFIG_GPIO_GENERIC=y CONFIG_GPIO_MAX730X=m @@ -4454,6 +4455,8 @@ CONFIG_CHARGER_TPS65217=m CONFIG_BATTERY_GAUGE_LTC2941=m CONFIG_BATTERY_RT5033=m CONFIG_CHARGER_RT9455=m +CONFIG_POWER_SEQUENCE=y +# CONFIG_PWRSEQ_GENERIC is not set CONFIG_HWMON=y CONFIG_HWMON_VID=m # CONFIG_HWMON_DEBUG_CHIP is not set @@ -5790,6 +5793,7 @@ CONFIG_DRM_SCHED=m # # I2C encoder or helper chips # +# CONFIG_DRM_I2C_ADIHDMI is not set CONFIG_DRM_I2C_CH7006=m CONFIG_DRM_I2C_SIL164=m CONFIG_DRM_I2C_NXP_TDA998X=m diff --git a/libre/linux-libre-pck/config.x86_64 b/libre/linux-libre-pck/config.x86_64 index 8a1a330ba..928e56b22 100644 --- a/libre/linux-libre-pck/config.x86_64 +++ b/libre/linux-libre-pck/config.x86_64 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 4.18.6-gnu-pck1 Kernel Configuration +# Linux/x86 4.18.9-gnu-pck1 Kernel Configuration # # @@ -57,7 +57,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # General setup # CONFIG_PCK_INTERACTIVE=y -# CONFIG_SCHED_PDS is not set +# CONFIG_SCHED_MUQSS is not set CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" @@ -385,7 +385,15 @@ CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MODVERSIONS=y CONFIG_MODULE_SRCVERSION_ALL=y -# CONFIG_MODULE_SIG is not set +CONFIG_MODULE_SIG=y +# CONFIG_MODULE_SIG_FORCE is not set +CONFIG_MODULE_SIG_ALL=y +# CONFIG_MODULE_SIG_SHA1 is not set +# CONFIG_MODULE_SIG_SHA224 is not set +# CONFIG_MODULE_SIG_SHA256 is not set +# CONFIG_MODULE_SIG_SHA384 is not set +CONFIG_MODULE_SIG_SHA512=y +CONFIG_MODULE_SIG_HASH="sha512" CONFIG_MODULE_COMPRESS=y # CONFIG_MODULE_COMPRESS_GZIP is not set CONFIG_MODULE_COMPRESS_XZ=y @@ -562,6 +570,8 @@ CONFIG_NR_CPUS=320 CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y +CONFIG_RQ_NONE=y +CONFIG_SHARERQ=0 # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y @@ -4250,6 +4260,7 @@ CONFIG_GPIO_ACPI=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y +# CONFIG_GPIO_OF_HELPER is not set CONFIG_GPIO_GENERIC=y CONFIG_GPIO_MAX730X=m @@ -4462,6 +4473,8 @@ CONFIG_CHARGER_TPS65217=m CONFIG_BATTERY_GAUGE_LTC2941=m CONFIG_BATTERY_RT5033=m CONFIG_CHARGER_RT9455=m +CONFIG_POWER_SEQUENCE=y +# CONFIG_PWRSEQ_GENERIC is not set CONFIG_HWMON=y CONFIG_HWMON_VID=m # CONFIG_HWMON_DEBUG_CHIP is not set @@ -5782,6 +5795,7 @@ CONFIG_DRM_SCHED=m # # I2C encoder or helper chips # +# CONFIG_DRM_I2C_ADIHDMI is not set CONFIG_DRM_I2C_CH7006=m CONFIG_DRM_I2C_SIL164=m CONFIG_DRM_I2C_NXP_TDA998X=m @@ -9173,9 +9187,10 @@ CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set CONFIG_EARLY_PRINTK_EFI=y # CONFIG_EARLY_PRINTK_USB_XDBC is not set +CONFIG_X86_PTDUMP_CORE=y # CONFIG_X86_PTDUMP is not set # CONFIG_EFI_PGT_DUMP is not set -# CONFIG_DEBUG_WX is not set +CONFIG_DEBUG_WX=y CONFIG_DOUBLEFAULT=y # CONFIG_DEBUG_TLBFLUSH is not set # CONFIG_IOMMU_DEBUG is not set @@ -9220,19 +9235,36 @@ CONFIG_SECURITY_INFINIBAND=y CONFIG_SECURITY_NETWORK_XFRM=y CONFIG_SECURITY_PATH=y # CONFIG_INTEL_TXT is not set +CONFIG_LSM_MMAP_MIN_ADDR=65536 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y CONFIG_HARDENED_USERCOPY_FALLBACK=y # CONFIG_HARDENED_USERCOPY_PAGESPAN is not set CONFIG_FORTIFY_SOURCE=y # CONFIG_STATIC_USERMODEHELPER is not set -# CONFIG_SECURITY_SELINUX is not set +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0 +# CONFIG_SECURITY_SELINUX_DISABLE is not set +CONFIG_SECURITY_SELINUX_DEVELOP=y +CONFIG_SECURITY_SELINUX_AVC_STATS=y +CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set -# CONFIG_SECURITY_APPARMOR is not set +CONFIG_SECURITY_APPARMOR=y +CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=0 +CONFIG_SECURITY_APPARMOR_HASH=y +CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y +# CONFIG_SECURITY_APPARMOR_DEBUG is not set # CONFIG_SECURITY_LOADPIN is not set CONFIG_SECURITY_YAMA=y -# CONFIG_INTEGRITY is not set +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +CONFIG_INTEGRITY_AUDIT=y +# CONFIG_IMA is not set +# CONFIG_EVM is not set +# CONFIG_DEFAULT_SECURITY_SELINUX is not set +# CONFIG_DEFAULT_SECURITY_APPARMOR is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_XOR_BLOCKS=m @@ -9352,7 +9384,7 @@ CONFIG_CRYPTO_SHA1_MB=m CONFIG_CRYPTO_SHA256_MB=m CONFIG_CRYPTO_SHA512_MB=m CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_SHA512=y CONFIG_CRYPTO_SHA3=m CONFIG_CRYPTO_SM3=m CONFIG_CRYPTO_TGR192=m @@ -9393,7 +9425,7 @@ CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m CONFIG_CRYPTO_SERPENT_AVX_X86_64=m CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m CONFIG_CRYPTO_SM4=m -CONFIG_CRYPTO_SPECK=m +# CONFIG_CRYPTO_SPECK is not set CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_TWOFISH_COMMON=m @@ -9460,6 +9492,7 @@ CONFIG_SIGNED_PE_FILE_VERIFICATION=y # # Certificates for signature checking # +CONFIG_MODULE_SIG_KEY="certs/signing_key.pem" CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set |