mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
ipq40xx: Add patches for 4.19
This adds the necessary patches for 4.19 kernel. Upstreamed patches were dropped, backported upstreamed patches from 4.20. Drop Winbond ID patch since that NAND IC was upstreamed to use SPI-NAND framework and support for it was backported from 4.20. Rework ESSEDMA patches to compile under 4.19 due to timer changes, Clément Péron did the hard work and his changes were taken from the initial 4.19 PR. MR33 changes had to be manually refreshed to apply. Refresh other patches to apply. Signed-off-by: Robert Marko <robimarko@gmail.com> Remove
This commit is contained in:
parent
96b69c2e9a
commit
8b7abea2f6
@ -0,0 +1,27 @@
|
|||||||
|
From 61a3bd10082b0e861b4e1bc451a92e20181a52f5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Felix Fietkau <nbd@nbd.name>
|
||||||
|
Date: Mon, 23 Jul 2018 16:17:35 +0200
|
||||||
|
Subject: [PATCH] soc: qcom: spm: add SCM probe dependency
|
||||||
|
|
||||||
|
Check for SCM availability before attempting to use SPM. SPM probe will
|
||||||
|
fail otherwise.
|
||||||
|
|
||||||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
Signed-off-by: Andy Gross <andy.gross@linaro.org>
|
||||||
|
---
|
||||||
|
drivers/soc/qcom/spm.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/soc/qcom/spm.c
|
||||||
|
+++ b/drivers/soc/qcom/spm.c
|
||||||
|
@@ -219,6 +219,9 @@ static int __init qcom_cpuidle_init(stru
|
||||||
|
cpumask_t mask;
|
||||||
|
bool use_scm_power_down = false;
|
||||||
|
|
||||||
|
+ if (!qcom_scm_is_available())
|
||||||
|
+ return -EPROBE_DEFER;
|
||||||
|
+
|
||||||
|
for (i = 0; ; i++) {
|
||||||
|
state_node = of_parse_phandle(cpu_node, "cpu-idle-states", i);
|
||||||
|
if (!state_node)
|
@ -0,0 +1,97 @@
|
|||||||
|
From 233c77d4f1d12e4337fba1146d5197f4c0f9107d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew McClintock <mmcclint@codeaurora.org>
|
||||||
|
Date: Wed, 25 Jul 2018 10:37:45 +0200
|
||||||
|
Subject: [PATCH] ARM: dts: qcom: ipq4019: use v2 of the kpss bringup mechanism
|
||||||
|
|
||||||
|
v1 was the incorrect choice here and sometimes the board
|
||||||
|
would not come up properly.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew McClintock <mmcclint@codeaurora.org>
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
Signed-off-by: Andy Gross <andy.gross@linaro.org>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 25 +++++++++++++++++--------
|
||||||
|
1 file changed, 17 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -52,7 +52,8 @@
|
||||||
|
cpu@0 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
- enable-method = "qcom,kpss-acc-v1";
|
||||||
|
+ enable-method = "qcom,kpss-acc-v2";
|
||||||
|
+ next-level-cache = <&L2>;
|
||||||
|
qcom,acc = <&acc0>;
|
||||||
|
qcom,saw = <&saw0>;
|
||||||
|
reg = <0x0>;
|
||||||
|
@@ -71,7 +72,8 @@
|
||||||
|
cpu@1 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
- enable-method = "qcom,kpss-acc-v1";
|
||||||
|
+ enable-method = "qcom,kpss-acc-v2";
|
||||||
|
+ next-level-cache = <&L2>;
|
||||||
|
qcom,acc = <&acc1>;
|
||||||
|
qcom,saw = <&saw1>;
|
||||||
|
reg = <0x1>;
|
||||||
|
@@ -90,7 +92,8 @@
|
||||||
|
cpu@2 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
- enable-method = "qcom,kpss-acc-v1";
|
||||||
|
+ enable-method = "qcom,kpss-acc-v2";
|
||||||
|
+ next-level-cache = <&L2>;
|
||||||
|
qcom,acc = <&acc2>;
|
||||||
|
qcom,saw = <&saw2>;
|
||||||
|
reg = <0x2>;
|
||||||
|
@@ -109,7 +112,8 @@
|
||||||
|
cpu@3 {
|
||||||
|
device_type = "cpu";
|
||||||
|
compatible = "arm,cortex-a7";
|
||||||
|
- enable-method = "qcom,kpss-acc-v1";
|
||||||
|
+ enable-method = "qcom,kpss-acc-v2";
|
||||||
|
+ next-level-cache = <&L2>;
|
||||||
|
qcom,acc = <&acc3>;
|
||||||
|
qcom,saw = <&saw3>;
|
||||||
|
reg = <0x3>;
|
||||||
|
@@ -124,6 +128,11 @@
|
||||||
|
>;
|
||||||
|
clock-latency = <256000>;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ L2: l2-cache {
|
||||||
|
+ compatible = "cache";
|
||||||
|
+ cache-level = <2>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
pmu {
|
||||||
|
@@ -292,22 +301,22 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
acc0: clock-controller@b088000 {
|
||||||
|
- compatible = "qcom,kpss-acc-v1";
|
||||||
|
+ compatible = "qcom,kpss-acc-v2";
|
||||||
|
reg = <0x0b088000 0x1000>, <0xb008000 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
acc1: clock-controller@b098000 {
|
||||||
|
- compatible = "qcom,kpss-acc-v1";
|
||||||
|
+ compatible = "qcom,kpss-acc-v2";
|
||||||
|
reg = <0x0b098000 0x1000>, <0xb008000 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
acc2: clock-controller@b0a8000 {
|
||||||
|
- compatible = "qcom,kpss-acc-v1";
|
||||||
|
+ compatible = "qcom,kpss-acc-v2";
|
||||||
|
reg = <0x0b0a8000 0x1000>, <0xb008000 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
acc3: clock-controller@b0b8000 {
|
||||||
|
- compatible = "qcom,kpss-acc-v1";
|
||||||
|
+ compatible = "qcom,kpss-acc-v2";
|
||||||
|
reg = <0x0b0b8000 0x1000>, <0xb008000 0x1000>;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,38 @@
|
|||||||
|
From 8a4540321e8bcf7a5b485c332a2e78f3501c78ed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Thu, 29 Nov 2018 22:29:36 +0100
|
||||||
|
Subject: [PATCH] ipq40xx: Fix booting secondary cores
|
||||||
|
|
||||||
|
Add the second part of old 071-qcom-ipq4019-use-v2-of-the-kpss-bringup-mechanism.patch
|
||||||
|
We dont modify the patch itself as its upstream and this change is not.
|
||||||
|
|
||||||
|
Originally added by Mantas Pucka Mantas Pucka <mantas@8devices.com>
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -132,6 +132,7 @@
|
||||||
|
L2: l2-cache {
|
||||||
|
compatible = "cache";
|
||||||
|
cache-level = <2>;
|
||||||
|
+ qcom,saw = <&saw_l2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -344,6 +345,12 @@
|
||||||
|
regulator;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ saw_l2: regulator@b012000 {
|
||||||
|
+ compatible = "qcom,saw2";
|
||||||
|
+ reg = <0xb012000 0x1000>;
|
||||||
|
+ regulator;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
blsp1_uart1: serial@78af000 {
|
||||||
|
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
|
||||||
|
reg = <0x78af000 0x200>;
|
@ -0,0 +1,110 @@
|
|||||||
|
From bcb9ab4c2917e92114d2f4c2b1da97cdf15b471b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew McClintock <mmcclint@codeaurora.org>
|
||||||
|
Date: Wed, 25 Jul 2018 10:37:46 +0200
|
||||||
|
Subject: [PATCH] ARM: dts: qcom: ipq4019: add cpu operating points for cpufreq
|
||||||
|
support
|
||||||
|
|
||||||
|
This adds some operating points for cpu frequeny scaling
|
||||||
|
|
||||||
|
Signed-off-by: Matthew McClintock <mmcclint@codeaurora.org>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
Signed-off-by: Andy Gross <andy.gross@linaro.org>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 54 ++++++++++++++---------------
|
||||||
|
1 file changed, 26 insertions(+), 28 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -59,14 +59,8 @@
|
||||||
|
reg = <0x0>;
|
||||||
|
clocks = <&gcc GCC_APPS_CLK_SRC>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
- operating-points = <
|
||||||
|
- /* kHz uV (fixed) */
|
||||||
|
- 48000 1100000
|
||||||
|
- 200000 1100000
|
||||||
|
- 500000 1100000
|
||||||
|
- 716000 1100000
|
||||||
|
- >;
|
||||||
|
clock-latency = <256000>;
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu@1 {
|
||||||
|
@@ -79,14 +73,8 @@
|
||||||
|
reg = <0x1>;
|
||||||
|
clocks = <&gcc GCC_APPS_CLK_SRC>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
- operating-points = <
|
||||||
|
- /* kHz uV (fixed) */
|
||||||
|
- 48000 1100000
|
||||||
|
- 200000 1100000
|
||||||
|
- 500000 1100000
|
||||||
|
- 666000 1100000
|
||||||
|
- >;
|
||||||
|
clock-latency = <256000>;
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu@2 {
|
||||||
|
@@ -99,14 +87,8 @@
|
||||||
|
reg = <0x2>;
|
||||||
|
clocks = <&gcc GCC_APPS_CLK_SRC>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
- operating-points = <
|
||||||
|
- /* kHz uV (fixed) */
|
||||||
|
- 48000 1100000
|
||||||
|
- 200000 1100000
|
||||||
|
- 500000 1100000
|
||||||
|
- 666000 1100000
|
||||||
|
- >;
|
||||||
|
clock-latency = <256000>;
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu@3 {
|
||||||
|
@@ -119,14 +101,8 @@
|
||||||
|
reg = <0x3>;
|
||||||
|
clocks = <&gcc GCC_APPS_CLK_SRC>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
- operating-points = <
|
||||||
|
- /* kHz uV (fixed) */
|
||||||
|
- 48000 1100000
|
||||||
|
- 200000 1100000
|
||||||
|
- 500000 1100000
|
||||||
|
- 666000 1100000
|
||||||
|
- >;
|
||||||
|
clock-latency = <256000>;
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
L2: l2-cache {
|
||||||
|
@@ -136,6 +112,28 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ cpu0_opp_table: opp_table0 {
|
||||||
|
+ compatible = "operating-points-v2";
|
||||||
|
+ opp-shared;
|
||||||
|
+
|
||||||
|
+ opp-48000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <48000000>;
|
||||||
|
+ clock-latency-ns = <256000>;
|
||||||
|
+ };
|
||||||
|
+ opp-200000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <200000000>;
|
||||||
|
+ clock-latency-ns = <256000>;
|
||||||
|
+ };
|
||||||
|
+ opp-500000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <500000000>;
|
||||||
|
+ clock-latency-ns = <256000>;
|
||||||
|
+ };
|
||||||
|
+ opp-716000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <716000000>;
|
||||||
|
+ clock-latency-ns = <256000>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
pmu {
|
||||||
|
compatible = "arm,cortex-a7-pmu";
|
||||||
|
interrupts = <GIC_PPI 7 (GIC_CPU_MASK_SIMPLE(4) |
|
@ -0,0 +1,34 @@
|
|||||||
|
From bd73a3dd257fb838bd456a18eeee0ef0224b7a40 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Date: Wed, 25 Jul 2018 10:37:47 +0200
|
||||||
|
Subject: [PATCH] ARM: dts: qcom: ipq4019: fix cpu0's qcom,saw2 reg value
|
||||||
|
|
||||||
|
while compiling an ipq4019 target, dtc will complain:
|
||||||
|
regulator@b089000 unit address format error, expected "2089000"
|
||||||
|
|
||||||
|
The saw0 regulator reg value seems to be
|
||||||
|
copied and pasted from qcom-ipq8064.dtsi.
|
||||||
|
|
||||||
|
This patch fixes the reg value to match that of the
|
||||||
|
unit address which in turn silences the warning.
|
||||||
|
(There is no driver for qcom,saw2 right now.
|
||||||
|
So this went unnoticed)
|
||||||
|
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
Signed-off-by: Andy Gross <andy.gross@linaro.org>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -321,7 +321,7 @@
|
||||||
|
|
||||||
|
saw0: regulator@b089000 {
|
||||||
|
compatible = "qcom,saw2";
|
||||||
|
- reg = <0x02089000 0x1000>, <0x0b009000 0x1000>;
|
||||||
|
+ reg = <0x0b089000 0x1000>, <0x0b009000 0x1000>;
|
||||||
|
regulator;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,36 @@
|
|||||||
|
From 89b43d59ec8c9cda588555eb1f2754dd19ef5144 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Date: Sun, 22 Jul 2018 12:07:57 +0200
|
||||||
|
Subject: [PATCH 8/8] ARM: qcom: Add IPQ4019 SoC support
|
||||||
|
|
||||||
|
Add support for the Qualcomm Atheros IPQ4019 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
---
|
||||||
|
arch/arm/Makefile | 1 +
|
||||||
|
arch/arm/mach-qcom/Kconfig | 5 +++++
|
||||||
|
2 files changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/Makefile
|
||||||
|
+++ b/arch/arm/Makefile
|
||||||
|
@@ -150,6 +150,7 @@ textofs-$(CONFIG_ARCH_MSM8X60) := 0x0020
|
||||||
|
textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
|
||||||
|
textofs-$(CONFIG_ARCH_MESON) := 0x00208000
|
||||||
|
textofs-$(CONFIG_ARCH_AXXIA) := 0x00308000
|
||||||
|
+textofs-$(CONFIG_ARCH_IPQ40XX) := 0x00208000
|
||||||
|
|
||||||
|
# Machine directory name. This list is sorted alphanumerically
|
||||||
|
# by CONFIG_* macro name.
|
||||||
|
--- a/arch/arm/mach-qcom/Kconfig
|
||||||
|
+++ b/arch/arm/mach-qcom/Kconfig
|
||||||
|
@@ -27,4 +27,9 @@ config ARCH_MDM9615
|
||||||
|
bool "Enable support for MDM9615"
|
||||||
|
select CLKSRC_QCOM
|
||||||
|
|
||||||
|
+config ARCH_IPQ40XX
|
||||||
|
+ bool "Enable support for IPQ40XX"
|
||||||
|
+ select CLKSRC_QCOM
|
||||||
|
+ select HAVE_ARM_ARCH_TIMER
|
||||||
|
+
|
||||||
|
endif
|
@ -0,0 +1,38 @@
|
|||||||
|
From 5f01733dc755dfadfa51b7b3c6c160e632fc6002 Mon Sep 17 00:00:00 2001
|
||||||
|
From: John Crispin <john@phrozen.org>
|
||||||
|
Date: Tue, 24 Jul 2018 15:09:36 +0200
|
||||||
|
Subject: [PATCH 1/3] dt-bindings: phy-qcom-ipq4019-usb: add binding document
|
||||||
|
|
||||||
|
This patch adds the binding documentation for the HS/SS USB PHY found
|
||||||
|
inside Qualcom Dakota SoCs.
|
||||||
|
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
---
|
||||||
|
.../bindings/phy/phy-qcom-ipq4019-usb.txt | 21 +++++++++++++++++++++
|
||||||
|
1 file changed, 21 insertions(+)
|
||||||
|
create mode 100644 Documentation/devicetree/bindings/phy/phy-qcom-ipq4019-usb.txt
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Documentation/devicetree/bindings/phy/phy-qcom-ipq4019-usb.txt
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+Qualcom Dakota HS/SS USB PHY
|
||||||
|
+
|
||||||
|
+Required properties:
|
||||||
|
+ - compatible: "qcom,usb-ss-ipq4019-phy",
|
||||||
|
+ "qcom,usb-hs-ipq4019-phy"
|
||||||
|
+ - reg: offset and length of the registers
|
||||||
|
+ - #phy-cells: should be 0
|
||||||
|
+ - resets: the reset controllers as listed below
|
||||||
|
+ - reset-names: the names of the reset controllers
|
||||||
|
+ "por_rst" - the POR reset line for SS and HS phys
|
||||||
|
+ "srif_rst" - the SRIF reset line for HS phys
|
||||||
|
+Example:
|
||||||
|
+
|
||||||
|
+hsphy@a8000 {
|
||||||
|
+ compatible = "qcom,usb-hs-ipq4019-phy";
|
||||||
|
+ phy-cells = <0>;
|
||||||
|
+ reg = <0xa8000 0x40>;
|
||||||
|
+ resets = <&gcc USB2_HSPHY_POR_ARES>,
|
||||||
|
+ <&gcc USB2_HSPHY_S_ARES>;
|
||||||
|
+ reset-names = "por_rst", "srif_rst";
|
||||||
|
+};
|
@ -0,0 +1,234 @@
|
|||||||
|
From 633f0e08498aebfdb932bd71319b4cb136709499 Mon Sep 17 00:00:00 2001
|
||||||
|
From: John Crispin <john@phrozen.org>
|
||||||
|
Date: Tue, 24 Jul 2018 14:45:49 +0200
|
||||||
|
Subject: [PATCH 2/3] phy: qcom-ipq4019-usb: add driver for QCOM/IPQ4019
|
||||||
|
|
||||||
|
Add a driver to setup the USB phy on Qualcom Dakota SoCs.
|
||||||
|
The driver sets up HS and SS phys. In case of HS some magic values need to
|
||||||
|
be written to magic offsets. These were taken from the SDK driver.
|
||||||
|
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
---
|
||||||
|
drivers/phy/qualcomm/Kconfig | 7 ++
|
||||||
|
drivers/phy/qualcomm/Makefile | 1 +
|
||||||
|
drivers/phy/qualcomm/phy-qcom-ipq4019-usb.c | 188 ++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 196 insertions(+)
|
||||||
|
create mode 100644 drivers/phy/qualcomm/phy-qcom-ipq4019-usb.c
|
||||||
|
|
||||||
|
--- a/drivers/phy/qualcomm/Kconfig
|
||||||
|
+++ b/drivers/phy/qualcomm/Kconfig
|
||||||
|
@@ -17,6 +17,13 @@ config PHY_QCOM_APQ8064_SATA
|
||||||
|
depends on OF
|
||||||
|
select GENERIC_PHY
|
||||||
|
|
||||||
|
+config PHY_QCOM_IPQ4019_USB
|
||||||
|
+ tristate "Qualcomm IPQ4019 USB PHY module"
|
||||||
|
+ depends on OF && ARCH_QCOM
|
||||||
|
+ select GENERIC_PHY
|
||||||
|
+ help
|
||||||
|
+ Support for the USB PHY on QCOM IPQ4019/Dakota chipsets.
|
||||||
|
+
|
||||||
|
config PHY_QCOM_IPQ806X_SATA
|
||||||
|
tristate "Qualcomm IPQ806x SATA SerDes/PHY driver"
|
||||||
|
depends on ARCH_QCOM
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/phy/qualcomm/phy-qcom-ipq4019-usb.c
|
||||||
|
@@ -0,0 +1,188 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (C) 2018 John Crispin <john@phrozen.org>
|
||||||
|
+ *
|
||||||
|
+ * Based on code from
|
||||||
|
+ * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
||||||
|
+ *
|
||||||
|
+ * 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.
|
||||||
|
+ *
|
||||||
|
+ * 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.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/delay.h>
|
||||||
|
+#include <linux/err.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/mutex.h>
|
||||||
|
+#include <linux/of_platform.h>
|
||||||
|
+#include <linux/phy/phy.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/reset.h>
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Magic registers copied from the SDK driver code
|
||||||
|
+ */
|
||||||
|
+#define PHY_CTRL0_ADDR 0x000
|
||||||
|
+#define PHY_CTRL1_ADDR 0x004
|
||||||
|
+#define PHY_CTRL2_ADDR 0x008
|
||||||
|
+#define PHY_CTRL3_ADDR 0x00C
|
||||||
|
+#define PHY_CTRL4_ADDR 0x010
|
||||||
|
+#define PHY_MISC_ADDR 0x024
|
||||||
|
+#define PHY_IPG_ADDR 0x030
|
||||||
|
+
|
||||||
|
+#define PHY_CTRL0_VAL 0xA4600015
|
||||||
|
+#define PHY_CTRL1_VAL 0x09500000
|
||||||
|
+#define PHY_CTRL2_VAL 0x00058180
|
||||||
|
+#define PHY_CTRL3_VAL 0x6DB6DCD6
|
||||||
|
+#define PHY_CTRL4_VAL 0x836DB6DB
|
||||||
|
+#define PHY_MISC_VAL 0x3803FB0C
|
||||||
|
+#define PHY_IPG_VAL 0x47323232
|
||||||
|
+
|
||||||
|
+struct ipq4019_usb_phy {
|
||||||
|
+ struct device *dev;
|
||||||
|
+ struct phy *phy;
|
||||||
|
+ void __iomem *base;
|
||||||
|
+ struct reset_control *por_rst;
|
||||||
|
+ struct reset_control *srif_rst;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int ipq4019_ss_phy_power_off(struct phy *_phy)
|
||||||
|
+{
|
||||||
|
+ struct ipq4019_usb_phy *phy = phy_get_drvdata(_phy);
|
||||||
|
+
|
||||||
|
+ reset_control_assert(phy->por_rst);
|
||||||
|
+ msleep(10);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ipq4019_ss_phy_power_on(struct phy *_phy)
|
||||||
|
+{
|
||||||
|
+ struct ipq4019_usb_phy *phy = phy_get_drvdata(_phy);
|
||||||
|
+
|
||||||
|
+ ipq4019_ss_phy_power_off(_phy);
|
||||||
|
+
|
||||||
|
+ reset_control_deassert(phy->por_rst);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct phy_ops ipq4019_usb_ss_phy_ops = {
|
||||||
|
+ .power_on = ipq4019_ss_phy_power_on,
|
||||||
|
+ .power_off = ipq4019_ss_phy_power_off,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int ipq4019_hs_phy_power_off(struct phy *_phy)
|
||||||
|
+{
|
||||||
|
+ struct ipq4019_usb_phy *phy = phy_get_drvdata(_phy);
|
||||||
|
+
|
||||||
|
+ reset_control_assert(phy->por_rst);
|
||||||
|
+ msleep(10);
|
||||||
|
+
|
||||||
|
+ reset_control_assert(phy->srif_rst);
|
||||||
|
+ msleep(10);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ipq4019_hs_phy_power_on(struct phy *_phy)
|
||||||
|
+{
|
||||||
|
+ struct ipq4019_usb_phy *phy = phy_get_drvdata(_phy);
|
||||||
|
+
|
||||||
|
+ ipq4019_hs_phy_power_off(_phy);
|
||||||
|
+
|
||||||
|
+ reset_control_deassert(phy->srif_rst);
|
||||||
|
+ msleep(10);
|
||||||
|
+
|
||||||
|
+ writel(PHY_CTRL0_VAL, phy->base + PHY_CTRL0_ADDR);
|
||||||
|
+ writel(PHY_CTRL1_VAL, phy->base + PHY_CTRL1_ADDR);
|
||||||
|
+ writel(PHY_CTRL2_VAL, phy->base + PHY_CTRL2_ADDR);
|
||||||
|
+ writel(PHY_CTRL3_VAL, phy->base + PHY_CTRL3_ADDR);
|
||||||
|
+ writel(PHY_CTRL4_VAL, phy->base + PHY_CTRL4_ADDR);
|
||||||
|
+ writel(PHY_MISC_VAL, phy->base + PHY_MISC_ADDR);
|
||||||
|
+ writel(PHY_IPG_VAL, phy->base + PHY_IPG_ADDR);
|
||||||
|
+ msleep(10);
|
||||||
|
+
|
||||||
|
+ reset_control_deassert(phy->por_rst);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct phy_ops ipq4019_usb_hs_phy_ops = {
|
||||||
|
+ .power_on = ipq4019_hs_phy_power_on,
|
||||||
|
+ .power_off = ipq4019_hs_phy_power_off,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id ipq4019_usb_phy_of_match[] = {
|
||||||
|
+ { .compatible = "qcom,usb-hs-ipq4019-phy", .data = &ipq4019_usb_hs_phy_ops},
|
||||||
|
+ { .compatible = "qcom,usb-ss-ipq4019-phy", .data = &ipq4019_usb_ss_phy_ops},
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, ipq4019_usb_phy_of_match);
|
||||||
|
+
|
||||||
|
+static int ipq4019_usb_phy_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct resource *res;
|
||||||
|
+ struct phy_provider *phy_provider;
|
||||||
|
+ struct ipq4019_usb_phy *phy;
|
||||||
|
+ const struct of_device_id *match;
|
||||||
|
+
|
||||||
|
+ match = of_match_device(ipq4019_usb_phy_of_match, &pdev->dev);
|
||||||
|
+ if (!match)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+
|
||||||
|
+ phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
|
||||||
|
+ if (!phy)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ phy->dev = &pdev->dev;
|
||||||
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
+ phy->base = devm_ioremap_resource(&pdev->dev, res);
|
||||||
|
+ if (IS_ERR(phy->base)) {
|
||||||
|
+ dev_err(dev, "failed to remap register memory\n");
|
||||||
|
+ return PTR_ERR(phy->base);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ phy->por_rst = devm_reset_control_get(phy->dev, "por_rst");
|
||||||
|
+ if (IS_ERR(phy->por_rst)) {
|
||||||
|
+ if (PTR_ERR(phy->por_rst) != -EPROBE_DEFER)
|
||||||
|
+ dev_err(dev, "POR reset is missing\n");
|
||||||
|
+ return PTR_ERR(phy->por_rst);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ phy->srif_rst = devm_reset_control_get_optional(phy->dev, "srif_rst");
|
||||||
|
+ if (IS_ERR(phy->srif_rst))
|
||||||
|
+ return PTR_ERR(phy->srif_rst);
|
||||||
|
+
|
||||||
|
+ phy->phy = devm_phy_create(dev, NULL, match->data);
|
||||||
|
+ if (IS_ERR(phy->phy)) {
|
||||||
|
+ dev_err(dev, "failed to create PHY\n");
|
||||||
|
+ return PTR_ERR(phy->phy);
|
||||||
|
+ }
|
||||||
|
+ phy_set_drvdata(phy->phy, phy);
|
||||||
|
+
|
||||||
|
+ phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(phy_provider);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct platform_driver ipq4019_usb_phy_driver = {
|
||||||
|
+ .probe = ipq4019_usb_phy_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .of_match_table = ipq4019_usb_phy_of_match,
|
||||||
|
+ .name = "ipq4019-usb-phy",
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+module_platform_driver(ipq4019_usb_phy_driver);
|
||||||
|
+
|
||||||
|
+MODULE_DESCRIPTION("QCOM/IPQ4019 USB phy driver");
|
||||||
|
+MODULE_AUTHOR("John Crispin <john@phrozen.org>");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
--- a/drivers/phy/qualcomm/Makefile
|
||||||
|
+++ b/drivers/phy/qualcomm/Makefile
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
obj-$(CONFIG_PHY_ATH79_USB) += phy-ath79-usb.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_APQ8064_SATA) += phy-qcom-apq8064-sata.o
|
||||||
|
+obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA) += phy-qcom-ipq806x-sata.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_QMP) += phy-qcom-qmp.o
|
||||||
|
obj-$(CONFIG_PHY_QCOM_QUSB2) += phy-qcom-qusb2.o
|
@ -0,0 +1,123 @@
|
|||||||
|
From 1fc7d5523e21ed140fed43c4dde011a3b6d9ba08 Mon Sep 17 00:00:00 2001
|
||||||
|
From: John Crispin <john@phrozen.org>
|
||||||
|
Date: Tue, 24 Jul 2018 14:47:55 +0200
|
||||||
|
Subject: [PATCH 3/3] qcom: ipq4019: add USB devicetree nodes
|
||||||
|
|
||||||
|
This patch makes USB work on the Dakota EVB.
|
||||||
|
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi | 20 ++++++++
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 74 +++++++++++++++++++++++++++
|
||||||
|
2 files changed, 94 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
|
||||||
|
@@ -109,5 +109,25 @@
|
||||||
|
wifi@a800000 {
|
||||||
|
status = "ok";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ usb3_ss_phy: ssphy@9a000 {
|
||||||
|
+ status = "ok";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb3_hs_phy: hsphy@a6000 {
|
||||||
|
+ status = "ok";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb3: usb3@8af8800 {
|
||||||
|
+ status = "ok";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb2_hs_phy: hsphy@a8000 {
|
||||||
|
+ status = "ok";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb2: usb2@60f8800 {
|
||||||
|
+ status = "ok";
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -564,5 +564,79 @@
|
||||||
|
"legacy";
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ usb3_ss_phy: ssphy@9a000 {
|
||||||
|
+ compatible = "qcom,usb-ss-ipq4019-phy";
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+ reg = <0x9a000 0x800>;
|
||||||
|
+ reg-names = "phy_base";
|
||||||
|
+ resets = <&gcc USB3_UNIPHY_PHY_ARES>;
|
||||||
|
+ reset-names = "por_rst";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb3_hs_phy: hsphy@a6000 {
|
||||||
|
+ compatible = "qcom,usb-hs-ipq4019-phy";
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+ reg = <0xa6000 0x40>;
|
||||||
|
+ reg-names = "phy_base";
|
||||||
|
+ resets = <&gcc USB3_HSPHY_POR_ARES>, <&gcc USB3_HSPHY_S_ARES>;
|
||||||
|
+ reset-names = "por_rst", "srif_rst";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb3@8af8800 {
|
||||||
|
+ compatible = "qcom,dwc3";
|
||||||
|
+ reg = <0x8af8800 0x100>;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+ clocks = <&gcc GCC_USB3_MASTER_CLK>,
|
||||||
|
+ <&gcc GCC_USB3_SLEEP_CLK>,
|
||||||
|
+ <&gcc GCC_USB3_MOCK_UTMI_CLK>;
|
||||||
|
+ clock-names = "master", "sleep", "mock_utmi";
|
||||||
|
+ ranges;
|
||||||
|
+ status = "disabled";
|
||||||
|
+
|
||||||
|
+ dwc3@8a00000 {
|
||||||
|
+ compatible = "snps,dwc3";
|
||||||
|
+ reg = <0x8a00000 0xf8000>;
|
||||||
|
+ interrupts = <0 132 0>;
|
||||||
|
+ phys = <&usb3_hs_phy>, <&usb3_ss_phy>;
|
||||||
|
+ phy-names = "usb2-phy", "usb3-phy";
|
||||||
|
+ dr_mode = "host";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb2_hs_phy: hsphy@a8000 {
|
||||||
|
+ compatible = "qcom,usb-hs-ipq4019-phy";
|
||||||
|
+ #phy-cells = <0>;
|
||||||
|
+ reg = <0xa8000 0x40>;
|
||||||
|
+ reg-names = "phy_base";
|
||||||
|
+ resets = <&gcc USB2_HSPHY_POR_ARES>, <&gcc USB2_HSPHY_S_ARES>;
|
||||||
|
+ reset-names = "por_rst", "srif_rst";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ usb2@60f8800 {
|
||||||
|
+ compatible = "qcom,dwc3";
|
||||||
|
+ reg = <0x60f8800 0x100>;
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+ clocks = <&gcc GCC_USB2_MASTER_CLK>,
|
||||||
|
+ <&gcc GCC_USB2_SLEEP_CLK>,
|
||||||
|
+ <&gcc GCC_USB2_MOCK_UTMI_CLK>;
|
||||||
|
+ clock-names = "master", "sleep", "mock_utmi";
|
||||||
|
+ ranges;
|
||||||
|
+ status = "disabled";
|
||||||
|
+
|
||||||
|
+ dwc3@6000000 {
|
||||||
|
+ compatible = "snps,dwc3";
|
||||||
|
+ reg = <0x6000000 0xf8000>;
|
||||||
|
+ interrupts = <0 136 0>;
|
||||||
|
+ phys = <&usb2_hs_phy>;
|
||||||
|
+ phy-names = "usb2-phy";
|
||||||
|
+ dr_mode = "host";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
};
|
@ -0,0 +1,25 @@
|
|||||||
|
From da89f500cb55fb3f19c4b399b46d8add0abbd4d6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mathias Kresin <dev@kresin.me>
|
||||||
|
Date: Wed, 25 Jul 2018 10:37:48 +0200
|
||||||
|
Subject: [PATCH] ARM: dts: qcom: ipq4019: fix PCI range
|
||||||
|
|
||||||
|
The PCI range is invalid and PCI attached devices doen't work.
|
||||||
|
|
||||||
|
Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
Signed-off-by: Andy Gross <andy.gross@linaro.org>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -401,7 +401,7 @@
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
ranges = <0x81000000 0 0x40200000 0x40200000 0 0x00100000
|
||||||
|
- 0x82000000 0 0x48000000 0x48000000 0 0x10000000>;
|
||||||
|
+ 0x82000000 0 0x40300000 0x40300000 0 0x400000>;
|
||||||
|
|
||||||
|
interrupts = <GIC_SPI 141 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
interrupt-names = "msi";
|
@ -0,0 +1,70 @@
|
|||||||
|
From patchwork Mon May 21 20:57:38 2018
|
||||||
|
Content-Type: text/plain; charset="utf-8"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
Subject: [v5,3/4] ARM: dts: qcom: add gpio-ranges property
|
||||||
|
X-Patchwork-Submitter: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
X-Patchwork-Id: 917856
|
||||||
|
Message-Id: <0ae3376606a89bcdf3fe753a5c967f7103699e09.1526935804.git.chunkeey@gmail.com>
|
||||||
|
To: linux-gpio@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
|
||||||
|
linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org
|
||||||
|
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>,
|
||||||
|
Linus Walleij <linus.walleij@linaro.org>,
|
||||||
|
Stephen Boyd <sboyd@kernel.org>, David Brown <david.brown@linaro.org>,
|
||||||
|
Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,
|
||||||
|
Andy Gross <andy.gross@linaro.org>,
|
||||||
|
Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||||
|
Date: Mon, 21 May 2018 22:57:38 +0200
|
||||||
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
List-Id: <linux-gpio.vger.kernel.org>
|
||||||
|
|
||||||
|
This patch adds the gpio-ranges property to almost all of
|
||||||
|
the Qualcomm ARM platforms that utilize the pinctrl-msm
|
||||||
|
framework.
|
||||||
|
|
||||||
|
The gpio-ranges property is part of the gpiolib subsystem.
|
||||||
|
As a result, the binding text is available in section
|
||||||
|
"2.1 gpio- and pin-controller interaction" of
|
||||||
|
Documentation/devicetree/bindings/gpio/gpio.txt
|
||||||
|
|
||||||
|
For more information please see the patch titled:
|
||||||
|
"pinctrl: msm: fix gpio-hog related boot issues" from
|
||||||
|
this series.
|
||||||
|
|
||||||
|
Reported-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
|
||||||
|
Tested-by: Sven Eckelmann <sven.eckelmann@openmesh.com> [ipq4019]
|
||||||
|
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||||
|
---
|
||||||
|
To help with git bisect, the DT update patch has been intentionally
|
||||||
|
placed after the "pinctrl: msm: fix gpio-hog related boot issues".
|
||||||
|
Otherwise - if the order was reveresed - and bisect decides to split
|
||||||
|
between these two patches, the gpiochip_add_pin_ranges() function
|
||||||
|
will be executed twice with the same parameters for the same pinctrl.
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-apq8064.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-apq8084.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-ipq8064.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-mdm9615.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-msm8660.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-msm8960.dtsi | 1 +
|
||||||
|
arch/arm/boot/dts/qcom-msm8974.dtsi | 1 +
|
||||||
|
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 3 ++-
|
||||||
|
arch/arm64/boot/dts/qcom/msm8916.dtsi | 1 +
|
||||||
|
arch/arm64/boot/dts/qcom/msm8992.dtsi | 1 +
|
||||||
|
arch/arm64/boot/dts/qcom/msm8994.dtsi | 1 +
|
||||||
|
arch/arm64/boot/dts/qcom/msm8996.dtsi | 1 +
|
||||||
|
13 files changed, 14 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -202,6 +202,7 @@
|
||||||
|
compatible = "qcom,ipq4019-pinctrl";
|
||||||
|
reg = <0x01000000 0x300000>;
|
||||||
|
gpio-controller;
|
||||||
|
+ gpio-ranges = <&tlmm 0 0 100>;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
@ -0,0 +1,115 @@
|
|||||||
|
From f2b87dc1028b710ec8ce25808b9d21f92b376184 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
|
Date: Sun, 11 Mar 2018 14:41:31 +0100
|
||||||
|
Subject: [PATCH 2/2] clk: fix apss cpu overclocking
|
||||||
|
|
||||||
|
There's an interaction issue between the clk changes:"
|
||||||
|
clk: qcom: ipq4019: Add the apss cpu pll divider clock node
|
||||||
|
clk: qcom: ipq4019: remove fixed clocks and add pll clocks
|
||||||
|
" and the cpufreq-dt.
|
||||||
|
|
||||||
|
cpufreq-dt is now spamming the kernel-log with the following:
|
||||||
|
|
||||||
|
[ 1099.190658] cpu cpu0: dev_pm_opp_set_rate: failed to find current OPP
|
||||||
|
for freq 761142857 (-34)
|
||||||
|
|
||||||
|
This only happens on certain devices like the Compex WPJ428
|
||||||
|
and AVM FritzBox!4040. However, other devices like the Asus
|
||||||
|
RT-AC58U and Meraki MR33 work just fine.
|
||||||
|
|
||||||
|
The issue stem from the fact that all higher CPU-Clocks
|
||||||
|
are achieved by switching the clock-parent to the P_DDRPLLAPSS
|
||||||
|
(ddrpllapss). Which is set by Qualcomm's proprietary bootcode
|
||||||
|
as part of the DDR calibration.
|
||||||
|
|
||||||
|
For example, the FB4040 uses 256 MiB Nanya NT5CC128M16IP clocked
|
||||||
|
at round 533 MHz (ddrpllsdcc = 190285714 Hz).
|
||||||
|
|
||||||
|
whereas the 128 MiB Nanya NT5CC64M16GP-DI in the ASUS RT-AC58U is
|
||||||
|
clocked at a slightly higher 537 MHz ( ddrpllsdcc = 192000000 Hz).
|
||||||
|
|
||||||
|
This patch attempts to fix the issue by modifying
|
||||||
|
clk_cpu_div_round_rate(), clk_cpu_div_set_rate(), clk_cpu_div_recalc_rate()
|
||||||
|
to use a new qcom_find_freq_close() function, which returns the closest
|
||||||
|
matching frequency, instead of the next higher. This way, the SoC in
|
||||||
|
the FB4040 (with its max clock speed of 710.4 MHz) will no longer
|
||||||
|
try to overclock to 761 MHz.
|
||||||
|
|
||||||
|
Fixes: d83dcacea18 ("clk: qcom: ipq4019: Add the apss cpu pll divider clock node")
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
---
|
||||||
|
drivers/clk/qcom/gcc-ipq4019.c | 34 +++++++++++++++++++++++++++++++---
|
||||||
|
1 file changed, 31 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/clk/qcom/gcc-ipq4019.c
|
||||||
|
+++ b/drivers/clk/qcom/gcc-ipq4019.c
|
||||||
|
@@ -1251,6 +1251,29 @@ static const struct clk_fepll_vco gcc_fe
|
||||||
|
.reg = 0x2f020,
|
||||||
|
};
|
||||||
|
|
||||||
|
+
|
||||||
|
+const struct freq_tbl *qcom_find_freq_close(const struct freq_tbl *f,
|
||||||
|
+ unsigned long rate)
|
||||||
|
+{
|
||||||
|
+ const struct freq_tbl *last = NULL;
|
||||||
|
+
|
||||||
|
+ for ( ; f->freq; f++) {
|
||||||
|
+ if (rate == f->freq)
|
||||||
|
+ return f;
|
||||||
|
+
|
||||||
|
+ if (f->freq > rate) {
|
||||||
|
+ if (!last ||
|
||||||
|
+ (f->freq - rate) < (rate - last->freq))
|
||||||
|
+ return f;
|
||||||
|
+ else
|
||||||
|
+ return last;
|
||||||
|
+ }
|
||||||
|
+ last = f;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return last;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Round rate function for APSS CPU PLL Clock divider.
|
||||||
|
* It looks up the frequency table and returns the next higher frequency
|
||||||
|
@@ -1263,7 +1286,7 @@ static long clk_cpu_div_round_rate(struc
|
||||||
|
struct clk_hw *p_hw;
|
||||||
|
const struct freq_tbl *f;
|
||||||
|
|
||||||
|
- f = qcom_find_freq(pll->freq_tbl, rate);
|
||||||
|
+ f = qcom_find_freq_close(pll->freq_tbl, rate);
|
||||||
|
if (!f)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
@@ -1286,7 +1309,7 @@ static int clk_cpu_div_set_rate(struct c
|
||||||
|
u32 mask;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- f = qcom_find_freq(pll->freq_tbl, rate);
|
||||||
|
+ f = qcom_find_freq_close(pll->freq_tbl, rate);
|
||||||
|
if (!f)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
@@ -1313,6 +1336,7 @@ static unsigned long
|
||||||
|
clk_cpu_div_recalc_rate(struct clk_hw *hw,
|
||||||
|
unsigned long parent_rate)
|
||||||
|
{
|
||||||
|
+ const struct freq_tbl *f;
|
||||||
|
struct clk_fepll *pll = to_clk_fepll(hw);
|
||||||
|
u32 cdiv, pre_div;
|
||||||
|
u64 rate;
|
||||||
|
@@ -1333,7 +1357,11 @@ clk_cpu_div_recalc_rate(struct clk_hw *h
|
||||||
|
rate = clk_fepll_vco_calc_rate(pll, parent_rate) * 2;
|
||||||
|
do_div(rate, pre_div);
|
||||||
|
|
||||||
|
- return rate;
|
||||||
|
+ f = qcom_find_freq_close(pll->freq_tbl, rate);
|
||||||
|
+ if (!f)
|
||||||
|
+ return rate;
|
||||||
|
+
|
||||||
|
+ return f->freq;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_ops clk_regmap_cpu_div_ops = {
|
@ -0,0 +1,31 @@
|
|||||||
|
From 342fc01bfd6d717602c71d96d3ef40a36e45e060 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Fri, 5 Oct 2018 09:02:50 +0200
|
||||||
|
Subject: [PATCH] mtd: spinand: winbond: Add support for W25N01GV
|
||||||
|
|
||||||
|
W25N01GV is a single die version of the already supported
|
||||||
|
W25M02GV with half the capacity. Everything else is the
|
||||||
|
same so introduce support for W25N01GV.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/winbond.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/winbond.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/winbond.c
|
||||||
|
@@ -84,6 +84,14 @@ static const struct spinand_info winbond
|
||||||
|
0,
|
||||||
|
SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL),
|
||||||
|
SPINAND_SELECT_TARGET(w25m02gv_select_target)),
|
||||||
|
+ SPINAND_INFO("W25N01GV", 0xAA,
|
||||||
|
+ NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(1, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ 0,
|
||||||
|
+ SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL)),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
@ -0,0 +1,62 @@
|
|||||||
|
--- a/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
+++ b/drivers/mtd/spi-nor/spi-nor.c
|
||||||
|
@@ -1091,6 +1091,7 @@ static const struct flash_info spi_nor_i
|
||||||
|
{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
|
||||||
|
{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
|
||||||
|
{ "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||||
|
+ { "mx25l25635f", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||||
|
{ "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
|
||||||
|
{ "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
|
||||||
|
{ "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||||
|
@@ -1273,11 +1274,12 @@ static const struct flash_info spi_nor_i
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
|
||||||
|
-static const struct flash_info *spi_nor_read_id(struct spi_nor *nor)
|
||||||
|
+static const struct flash_info *spi_nor_read_id(struct spi_nor *nor,
|
||||||
|
+ const char *name)
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
u8 id[SPI_NOR_MAX_ID_LEN];
|
||||||
|
- const struct flash_info *info;
|
||||||
|
+ const struct flash_info *info, *first_match = NULL;
|
||||||
|
|
||||||
|
tmp = nor->read_reg(nor, SPINOR_OP_RDID, id, SPI_NOR_MAX_ID_LEN);
|
||||||
|
if (tmp < 0) {
|
||||||
|
@@ -1288,10 +1290,16 @@ static const struct flash_info *spi_nor_
|
||||||
|
for (tmp = 0; tmp < ARRAY_SIZE(spi_nor_ids) - 1; tmp++) {
|
||||||
|
info = &spi_nor_ids[tmp];
|
||||||
|
if (info->id_len) {
|
||||||
|
- if (!memcmp(info->id, id, info->id_len))
|
||||||
|
- return &spi_nor_ids[tmp];
|
||||||
|
+ if (!memcmp(info->id, id, info->id_len)) {
|
||||||
|
+ if (!name || !strcmp(name, info->name))
|
||||||
|
+ return info;
|
||||||
|
+ if (!first_match)
|
||||||
|
+ first_match = info;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ if (first_match)
|
||||||
|
+ return first_match;
|
||||||
|
dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %02x, %02x\n",
|
||||||
|
id[0], id[1], id[2]);
|
||||||
|
return ERR_PTR(-ENODEV);
|
||||||
|
@@ -2825,7 +2833,7 @@ int spi_nor_scan(struct spi_nor *nor, co
|
||||||
|
info = spi_nor_match_id(name);
|
||||||
|
/* Try to auto-detect if chip name wasn't specified or not found */
|
||||||
|
if (!info)
|
||||||
|
- info = spi_nor_read_id(nor);
|
||||||
|
+ info = spi_nor_read_id(nor, NULL);
|
||||||
|
if (IS_ERR_OR_NULL(info))
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
@@ -2836,7 +2844,7 @@ int spi_nor_scan(struct spi_nor *nor, co
|
||||||
|
if (name && info->id_len) {
|
||||||
|
const struct flash_info *jinfo;
|
||||||
|
|
||||||
|
- jinfo = spi_nor_read_id(nor);
|
||||||
|
+ jinfo = spi_nor_read_id(nor, name);
|
||||||
|
if (IS_ERR(jinfo)) {
|
||||||
|
return PTR_ERR(jinfo);
|
||||||
|
} else if (jinfo != info) {
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,52 @@
|
|||||||
|
From 09ed737593f71bcca08a537a6c15264a1a6add08 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Date: Sun, 20 Nov 2016 01:10:33 +0100
|
||||||
|
Subject: [PATCH] dts: ipq4019: add mdio node for ethernet
|
||||||
|
|
||||||
|
This patch adds the mdio device-tree node.
|
||||||
|
This is where the switch is connected to, so it's needed
|
||||||
|
for the ethernet interfaces.
|
||||||
|
|
||||||
|
Note: The driver isn't anywhere close to be upstream,
|
||||||
|
so the info might change.
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 28 ++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 28 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -566,6 +566,34 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ mdio@90000 {
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <0>;
|
||||||
|
+ compatible = "qcom,ipq4019-mdio";
|
||||||
|
+ reg = <0x90000 0x64>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+
|
||||||
|
+ ethernet-phy@0 {
|
||||||
|
+ reg = <0>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ethernet-phy@1 {
|
||||||
|
+ reg = <1>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ethernet-phy@2 {
|
||||||
|
+ reg = <2>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ethernet-phy@3 {
|
||||||
|
+ reg = <3>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ethernet-phy@4 {
|
||||||
|
+ reg = <4>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb3_ss_phy: ssphy@9a000 {
|
||||||
|
compatible = "qcom,usb-ss-ipq4019-phy";
|
||||||
|
#phy-cells = <0>;
|
@ -0,0 +1,46 @@
|
|||||||
|
From 9deeec35dd3b628b95624e41d4e04acf728991ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Date: Sun, 20 Nov 2016 02:20:54 +0100
|
||||||
|
Subject: [PATCH] dts: ipq4019: add PHY/switch nodes
|
||||||
|
|
||||||
|
This patch adds both the "qcom,ess-switch" and "qcom,ess-psgmii"
|
||||||
|
nodes which are needed for the ar40xx.c driver to initialize the
|
||||||
|
switch.
|
||||||
|
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 23 +++++++++++++++++++++++
|
||||||
|
1 file changed, 23 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -594,6 +594,29 @@
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
+ ess-switch@c000000 {
|
||||||
|
+ compatible = "qcom,ess-switch";
|
||||||
|
+ reg = <0xc000000 0x80000>;
|
||||||
|
+ switch_access_mode = "local bus";
|
||||||
|
+ resets = <&gcc ESS_RESET>;
|
||||||
|
+ reset-names = "ess_rst";
|
||||||
|
+ clocks = <&gcc GCC_ESS_CLK>;
|
||||||
|
+ clock-names = "ess_clk";
|
||||||
|
+ switch_cpu_bmp = <0x1>;
|
||||||
|
+ switch_lan_bmp = <0x1e>;
|
||||||
|
+ switch_wan_bmp = <0x20>;
|
||||||
|
+ switch_mac_mode = <0>; /* PORT_WRAPPER_PSGMII */
|
||||||
|
+ switch_initvlas = <0x7c 0x54>;
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ess-psgmii@98000 {
|
||||||
|
+ compatible = "qcom,ess-psgmii";
|
||||||
|
+ reg = <0x98000 0x800>;
|
||||||
|
+ psgmii_access_mode = "local bus";
|
||||||
|
+ status = "disabled";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb3_ss_phy: ssphy@9a000 {
|
||||||
|
compatible = "qcom,usb-ss-ipq4019-phy";
|
||||||
|
#phy-cells = <0>;
|
@ -0,0 +1,53 @@
|
|||||||
|
From 7c129254adb1093d10a62ed7bf7b956fcc6ffe34 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rakesh Nair <ranair@codeaurora.org>
|
||||||
|
Date: Wed, 20 Jul 2016 15:02:01 +0530
|
||||||
|
Subject: [PATCH] net: IPQ4019 needs rfs/vlan_tag callbacks in
|
||||||
|
netdev_ops
|
||||||
|
|
||||||
|
Add callback support to get default vlan tag and register
|
||||||
|
receive flow steering filter.
|
||||||
|
|
||||||
|
Used by IPQ4019 ess-edma driver.
|
||||||
|
|
||||||
|
BUG=chrome-os-partner:33096
|
||||||
|
TEST=none
|
||||||
|
|
||||||
|
Change-Id: I266070e4a0fbe4a0d9966fe79a71e50ec4f26c75
|
||||||
|
Signed-off-by: Rakesh Nair <ranair@codeaurora.org>
|
||||||
|
Reviewed-on: https://chromium-review.googlesource.com/362203
|
||||||
|
Commit-Ready: Grant Grundler <grundler@chromium.org>
|
||||||
|
Tested-by: Grant Grundler <grundler@chromium.org>
|
||||||
|
Reviewed-by: Grant Grundler <grundler@chromium.org>
|
||||||
|
---
|
||||||
|
include/linux/netdevice.h | 13 +++++++++++++
|
||||||
|
1 file changed, 13 insertions(+)
|
||||||
|
|
||||||
|
--- a/include/linux/netdevice.h
|
||||||
|
+++ b/include/linux/netdevice.h
|
||||||
|
@@ -739,6 +739,16 @@ struct xps_map {
|
||||||
|
#define XPS_MIN_MAP_ALLOC ((L1_CACHE_ALIGN(offsetof(struct xps_map, queues[1])) \
|
||||||
|
- sizeof(struct xps_map)) / sizeof(u16))
|
||||||
|
|
||||||
|
+#ifdef CONFIG_RFS_ACCEL
|
||||||
|
+typedef int (*set_rfs_filter_callback_t)(struct net_device *dev,
|
||||||
|
+ __be32 src,
|
||||||
|
+ __be32 dst,
|
||||||
|
+ __be16 sport,
|
||||||
|
+ __be16 dport,
|
||||||
|
+ u8 proto,
|
||||||
|
+ u16 rxq_index,
|
||||||
|
+ u32 action);
|
||||||
|
+#endif
|
||||||
|
/*
|
||||||
|
* This structure holds all XPS maps for device. Maps are indexed by CPU.
|
||||||
|
*/
|
||||||
|
@@ -1353,6 +1363,9 @@ struct net_device_ops {
|
||||||
|
const struct sk_buff *skb,
|
||||||
|
u16 rxq_index,
|
||||||
|
u32 flow_id);
|
||||||
|
+ int (*ndo_register_rfs_filter)(struct net_device *dev,
|
||||||
|
+ set_rfs_filter_callback_t set_filter);
|
||||||
|
+ int (*ndo_get_default_vlan_tag)(struct net_device *net);
|
||||||
|
#endif
|
||||||
|
int (*ndo_add_slave)(struct net_device *dev,
|
||||||
|
struct net_device *slave_dev,
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,92 @@
|
|||||||
|
From c611d3780fa101662a822d10acf8feb04ca97409 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Date: Sun, 20 Nov 2016 01:01:10 +0100
|
||||||
|
Subject: [PATCH] dts: ipq4019: add ethernet essedma node
|
||||||
|
|
||||||
|
This patch adds the device-tree node for the ethernet
|
||||||
|
interfaces.
|
||||||
|
|
||||||
|
Note: The driver isn't anywhere close to be upstream,
|
||||||
|
so the info might change.
|
||||||
|
|
||||||
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/qcom-ipq4019.dtsi | 60 +++++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 60 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||||
|
@@ -44,6 +44,8 @@
|
||||||
|
spi1 = &blsp1_spi2;
|
||||||
|
i2c0 = &blsp1_i2c3;
|
||||||
|
i2c1 = &blsp1_i2c4;
|
||||||
|
+ ethernet0 = &gmac0;
|
||||||
|
+ ethernet1 = &gmac1;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpus {
|
||||||
|
@@ -617,6 +619,64 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ edma@c080000 {
|
||||||
|
+ compatible = "qcom,ess-edma";
|
||||||
|
+ reg = <0xc080000 0x8000>;
|
||||||
|
+ qcom,page-mode = <0>;
|
||||||
|
+ qcom,rx_head_buf_size = <1540>;
|
||||||
|
+ qcom,mdio_supported;
|
||||||
|
+ qcom,poll_required = <1>;
|
||||||
|
+ qcom,num_gmac = <2>;
|
||||||
|
+ interrupts = <0 65 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 66 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 67 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 68 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 69 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 70 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 71 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 72 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 73 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 74 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 75 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 76 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 77 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 78 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 79 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 80 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 240 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 241 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 242 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 243 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 244 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 245 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 246 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 247 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 248 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 249 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 250 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 251 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 252 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 253 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 254 IRQ_TYPE_EDGE_RISING
|
||||||
|
+ 0 255 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
+
|
||||||
|
+ status = "disabled";
|
||||||
|
+
|
||||||
|
+ gmac0: gmac0 {
|
||||||
|
+ local-mac-address = [00 00 00 00 00 00];
|
||||||
|
+ vlan_tag = <1 0x1f>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ gmac1: gmac1 {
|
||||||
|
+ local-mac-address = [00 00 00 00 00 00];
|
||||||
|
+ qcom,phy_mdio_addr = <4>;
|
||||||
|
+ qcom,poll_required = <1>;
|
||||||
|
+ qcom,forced_speed = <1000>;
|
||||||
|
+ qcom,forced_duplex = <1>;
|
||||||
|
+ vlan_tag = <2 0x20>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb3_ss_phy: ssphy@9a000 {
|
||||||
|
compatible = "qcom,usb-ss-ipq4019-phy";
|
||||||
|
#phy-cells = <0>;
|
334
target/linux/ipq40xx/patches-4.19/712-mr33-essedma.patch
Normal file
334
target/linux/ipq40xx/patches-4.19/712-mr33-essedma.patch
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
--- a/drivers/net/ethernet/qualcomm/essedma/edma.c
|
||||||
|
+++ b/drivers/net/ethernet/qualcomm/essedma/edma.c
|
||||||
|
@@ -161,8 +161,10 @@ static void edma_configure_rx(struct edm
|
||||||
|
/* Set Rx FIFO threshold to start to DMA data to host */
|
||||||
|
rxq_ctrl_data = EDMA_FIFO_THRESH_128_BYTE;
|
||||||
|
|
||||||
|
+ if (!edma_cinfo->is_single_phy) {
|
||||||
|
/* Set RX remove vlan bit */
|
||||||
|
rxq_ctrl_data |= EDMA_RXQ_CTRL_RMV_VLAN;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
edma_write_reg(EDMA_REG_RXQ_CTRL, rxq_ctrl_data);
|
||||||
|
}
|
||||||
|
@@ -1293,6 +1295,10 @@ void edma_adjust_link(struct net_device
|
||||||
|
if (status == __EDMA_LINKUP && adapter->link_state == __EDMA_LINKDOWN) {
|
||||||
|
dev_info(&adapter->pdev->dev, "%s: GMAC Link is up with phy_speed=%d\n", netdev->name, phydev->speed);
|
||||||
|
adapter->link_state = __EDMA_LINKUP;
|
||||||
|
+ if (adapter->edma_cinfo->is_single_phy) {
|
||||||
|
+ ess_set_port_status_speed(adapter->edma_cinfo, phydev,
|
||||||
|
+ ffs(adapter->dp_bitmap) - 1);
|
||||||
|
+ }
|
||||||
|
netif_carrier_on(netdev);
|
||||||
|
if (netif_running(netdev))
|
||||||
|
netif_tx_wake_all_queues(netdev);
|
||||||
|
@@ -1386,10 +1392,12 @@ netdev_tx_t edma_xmit(struct sk_buff *sk
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check and mark VLAN tag offload */
|
||||||
|
- if (skb_vlan_tag_present(skb))
|
||||||
|
- flags_transmit |= EDMA_VLAN_TX_TAG_INSERT_FLAG;
|
||||||
|
- else if (adapter->default_vlan_tag)
|
||||||
|
- flags_transmit |= EDMA_VLAN_TX_TAG_INSERT_DEFAULT_FLAG;
|
||||||
|
+ if (!adapter->edma_cinfo->is_single_phy) {
|
||||||
|
+ if (unlikely(skb_vlan_tag_present(skb)))
|
||||||
|
+ flags_transmit |= EDMA_VLAN_TX_TAG_INSERT_FLAG;
|
||||||
|
+ else if (adapter->default_vlan_tag)
|
||||||
|
+ flags_transmit |= EDMA_VLAN_TX_TAG_INSERT_DEFAULT_FLAG;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Check and mark checksum offload */
|
||||||
|
if (likely(skb->ip_summed == CHECKSUM_PARTIAL))
|
||||||
|
--- a/drivers/net/ethernet/qualcomm/essedma/edma.h
|
||||||
|
+++ b/drivers/net/ethernet/qualcomm/essedma/edma.h
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
@@ -332,6 +333,9 @@ struct edma_common_info {
|
||||||
|
struct edma_per_cpu_queues_info edma_percpu_info[CONFIG_NR_CPUS]; /* per cpu information */
|
||||||
|
spinlock_t stats_lock; /* protect edma stats area for updation */
|
||||||
|
struct timer_list edma_stats_timer;
|
||||||
|
+ bool is_single_phy;
|
||||||
|
+ void __iomem *ess_hw_addr;
|
||||||
|
+ struct clk *ess_clk;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* transimit packet descriptor (tpd) ring */
|
||||||
|
@@ -444,4 +448,6 @@ void edma_change_tx_coalesce(int usecs);
|
||||||
|
void edma_change_rx_coalesce(int usecs);
|
||||||
|
void edma_get_tx_rx_coalesce(u32 *reg_val);
|
||||||
|
void edma_clear_irq_status(void);
|
||||||
|
+void ess_set_port_status_speed(struct edma_common_info *edma_cinfo,
|
||||||
|
+ struct phy_device *phydev, uint8_t port_id);
|
||||||
|
#endif /* _EDMA_H_ */
|
||||||
|
--- a/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
|
||||||
|
+++ b/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
|
||||||
|
@@ -17,6 +17,11 @@
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_net.h>
|
||||||
|
#include <linux/timer.h>
|
||||||
|
+#include <linux/of_platform.h>
|
||||||
|
+#include <linux/of_address.h>
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/string.h>
|
||||||
|
+#include <linux/reset.h>
|
||||||
|
#include "edma.h"
|
||||||
|
#include "ess_edma.h"
|
||||||
|
|
||||||
|
@@ -81,6 +86,101 @@ void edma_read_reg(u16 reg_addr, volatil
|
||||||
|
*reg_value = readl((void __iomem *)(edma_hw_addr + reg_addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void ess_write_reg(struct edma_common_info *edma, u16 reg_addr, u32 reg_value)
|
||||||
|
+{
|
||||||
|
+ writel(reg_value, ((void __iomem *)
|
||||||
|
+ ((unsigned long)edma->ess_hw_addr + reg_addr)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void ess_read_reg(struct edma_common_info *edma, u16 reg_addr,
|
||||||
|
+ volatile u32 *reg_value)
|
||||||
|
+{
|
||||||
|
+ *reg_value = readl((void __iomem *)
|
||||||
|
+ ((unsigned long)edma->ess_hw_addr + reg_addr));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int ess_reset(struct edma_common_info *edma)
|
||||||
|
+{
|
||||||
|
+ struct device_node *switch_node = NULL;
|
||||||
|
+ struct reset_control *ess_rst;
|
||||||
|
+ u32 regval;
|
||||||
|
+
|
||||||
|
+ switch_node = of_find_node_by_name(NULL, "ess-switch");
|
||||||
|
+ if (!switch_node) {
|
||||||
|
+ pr_err("switch-node not found\n");
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ess_rst = of_reset_control_get(switch_node, "ess_rst");
|
||||||
|
+ of_node_put(switch_node);
|
||||||
|
+
|
||||||
|
+ if (IS_ERR(ess_rst)) {
|
||||||
|
+ pr_err("failed to find ess_rst!\n");
|
||||||
|
+ return -ENOENT;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ reset_control_assert(ess_rst);
|
||||||
|
+ msleep(10);
|
||||||
|
+ reset_control_deassert(ess_rst);
|
||||||
|
+ msleep(100);
|
||||||
|
+ reset_control_put(ess_rst);
|
||||||
|
+
|
||||||
|
+ /* Enable only port 5 <--> port 0
|
||||||
|
+ * bits 0:6 bitmap of ports it can fwd to */
|
||||||
|
+#define SET_PORT_BMP(r,v) \
|
||||||
|
+ ess_read_reg(edma, r, ®val); \
|
||||||
|
+ ess_write_reg(edma, r, ((regval & ~0x3F) | v));
|
||||||
|
+
|
||||||
|
+ SET_PORT_BMP(ESS_PORT0_LOOKUP_CTRL,0x20);
|
||||||
|
+ SET_PORT_BMP(ESS_PORT1_LOOKUP_CTRL,0x00);
|
||||||
|
+ SET_PORT_BMP(ESS_PORT2_LOOKUP_CTRL,0x00);
|
||||||
|
+ SET_PORT_BMP(ESS_PORT3_LOOKUP_CTRL,0x00);
|
||||||
|
+ SET_PORT_BMP(ESS_PORT4_LOOKUP_CTRL,0x00);
|
||||||
|
+ SET_PORT_BMP(ESS_PORT5_LOOKUP_CTRL,0x01);
|
||||||
|
+ ess_write_reg(edma, ESS_RGMII_CTRL, 0x400);
|
||||||
|
+ ess_write_reg(edma, ESS_PORT0_STATUS, ESS_PORT_1G_FDX);
|
||||||
|
+ ess_write_reg(edma, ESS_PORT5_STATUS, ESS_PORT_1G_FDX);
|
||||||
|
+ ess_write_reg(edma, ESS_PORT0_HEADER_CTRL, 0);
|
||||||
|
+#undef SET_PORT_BMP
|
||||||
|
+
|
||||||
|
+ /* forward multicast and broadcast frames to CPU */
|
||||||
|
+ ess_write_reg(edma, ESS_FWD_CTRL1,
|
||||||
|
+ (ESS_PORTS_ALL << ESS_FWD_CTRL1_UC_FLOOD_S) |
|
||||||
|
+ (ESS_PORTS_ALL << ESS_FWD_CTRL1_MC_FLOOD_S) |
|
||||||
|
+ (ESS_PORTS_ALL << ESS_FWD_CTRL1_BC_FLOOD_S));
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void ess_set_port_status_speed(struct edma_common_info *edma,
|
||||||
|
+ struct phy_device *phydev, uint8_t port_id)
|
||||||
|
+{
|
||||||
|
+ uint16_t reg_off = ESS_PORT0_STATUS + (4 * port_id);
|
||||||
|
+ uint32_t reg_val = 0;
|
||||||
|
+
|
||||||
|
+ ess_read_reg(edma, reg_off, ®_val);
|
||||||
|
+
|
||||||
|
+ /* reset the speed bits [0:1] */
|
||||||
|
+ reg_val &= ~ESS_PORT_STATUS_SPEED_INV;
|
||||||
|
+
|
||||||
|
+ /* set the new speed */
|
||||||
|
+ switch(phydev->speed) {
|
||||||
|
+ case SPEED_1000: reg_val |= ESS_PORT_STATUS_SPEED_1000; break;
|
||||||
|
+ case SPEED_100: reg_val |= ESS_PORT_STATUS_SPEED_100; break;
|
||||||
|
+ case SPEED_10: reg_val |= ESS_PORT_STATUS_SPEED_10; break;
|
||||||
|
+ default: reg_val |= ESS_PORT_STATUS_SPEED_INV; break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* check full/half duplex */
|
||||||
|
+ if (phydev->duplex) {
|
||||||
|
+ reg_val |= ESS_PORT_STATUS_DUPLEX_MODE;
|
||||||
|
+ } else {
|
||||||
|
+ reg_val &= ~ESS_PORT_STATUS_DUPLEX_MODE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ess_write_reg(edma, reg_off, reg_val);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* edma_change_tx_coalesce()
|
||||||
|
* change tx interrupt moderation timer
|
||||||
|
*/
|
||||||
|
@@ -550,6 +650,31 @@ static struct ctl_table edma_table[] = {
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
+static int ess_parse(struct edma_common_info *edma)
|
||||||
|
+{
|
||||||
|
+ struct device_node *switch_node;
|
||||||
|
+ int ret = -EINVAL;
|
||||||
|
+
|
||||||
|
+ switch_node = of_find_node_by_name(NULL, "ess-switch");
|
||||||
|
+ if (!switch_node) {
|
||||||
|
+ pr_err("cannot find ess-switch node\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ edma->ess_hw_addr = of_io_request_and_map(switch_node,
|
||||||
|
+ 0, KBUILD_MODNAME);
|
||||||
|
+ if (!edma->ess_hw_addr) {
|
||||||
|
+ pr_err("%s ioremap fail.", __func__);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ edma->ess_clk = of_clk_get_by_name(switch_node, "ess_clk");
|
||||||
|
+ ret = clk_prepare_enable(edma->ess_clk);
|
||||||
|
+out:
|
||||||
|
+ of_node_put(switch_node);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* edma_axi_netdev_ops
|
||||||
|
* Describe the operations supported by registered netdevices
|
||||||
|
*
|
||||||
|
@@ -785,6 +910,17 @@ static int edma_axi_probe(struct platfor
|
||||||
|
miibus = mdio_data->mii_bus;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (of_property_read_bool(np, "qcom,single-phy") &&
|
||||||
|
+ edma_cinfo->num_gmac == 1) {
|
||||||
|
+ err = ess_parse(edma_cinfo);
|
||||||
|
+ if (!err)
|
||||||
|
+ err = ess_reset(edma_cinfo);
|
||||||
|
+ if (err)
|
||||||
|
+ goto err_single_phy_init;
|
||||||
|
+ else
|
||||||
|
+ edma_cinfo->is_single_phy = true;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
for_each_available_child_of_node(np, pnp) {
|
||||||
|
const char *mac_addr;
|
||||||
|
|
||||||
|
@@ -1073,11 +1209,15 @@ static int edma_axi_probe(struct platfor
|
||||||
|
|
||||||
|
for (i = 0; i < edma_cinfo->num_gmac; i++) {
|
||||||
|
if (adapter[i]->poll_required) {
|
||||||
|
+ int phy_mode = of_get_phy_mode(np);
|
||||||
|
+
|
||||||
|
+ if (phy_mode < 0)
|
||||||
|
+ phy_mode = PHY_INTERFACE_MODE_SGMII;
|
||||||
|
adapter[i]->phydev =
|
||||||
|
phy_connect(edma_netdev[i],
|
||||||
|
(const char *)adapter[i]->phy_id,
|
||||||
|
&edma_adjust_link,
|
||||||
|
- PHY_INTERFACE_MODE_SGMII);
|
||||||
|
+ phy_mode);
|
||||||
|
if (IS_ERR(adapter[i]->phydev)) {
|
||||||
|
dev_dbg(&pdev->dev, "PHY attach FAIL");
|
||||||
|
err = -EIO;
|
||||||
|
@@ -1121,6 +1261,9 @@ err_rmap_alloc_fail:
|
||||||
|
for (i = 0; i < edma_cinfo->num_gmac; i++)
|
||||||
|
unregister_netdev(edma_netdev[i]);
|
||||||
|
err_register:
|
||||||
|
+err_single_phy_init:
|
||||||
|
+ iounmap(edma_cinfo->ess_hw_addr);
|
||||||
|
+ clk_disable_unprepare(edma_cinfo->ess_clk);
|
||||||
|
err_mdiobus_init_fail:
|
||||||
|
edma_free_rx_rings(edma_cinfo);
|
||||||
|
err_rx_rinit:
|
||||||
|
@@ -1181,6 +1324,8 @@ static int edma_axi_remove(struct platfo
|
||||||
|
del_timer_sync(&edma_cinfo->edma_stats_timer);
|
||||||
|
edma_free_irqs(adapter);
|
||||||
|
unregister_net_sysctl_table(edma_cinfo->edma_ctl_table_hdr);
|
||||||
|
+ iounmap(edma_cinfo->ess_hw_addr);
|
||||||
|
+ clk_disable_unprepare(edma_cinfo->ess_clk);
|
||||||
|
edma_free_tx_resources(edma_cinfo);
|
||||||
|
edma_free_rx_resources(edma_cinfo);
|
||||||
|
edma_free_tx_rings(edma_cinfo);
|
||||||
|
--- a/drivers/net/ethernet/qualcomm/essedma/ess_edma.h
|
||||||
|
+++ b/drivers/net/ethernet/qualcomm/essedma/ess_edma.h
|
||||||
|
@@ -329,4 +329,61 @@ struct edma_hw;
|
||||||
|
#define EDMA_RRD_PRIORITY_MASK 0x7
|
||||||
|
#define EDMA_RRD_PORT_TYPE_SHIFT 7
|
||||||
|
#define EDMA_RRD_PORT_TYPE_MASK 0x1F
|
||||||
|
+
|
||||||
|
+#define ESS_RGMII_CTRL 0x0004
|
||||||
|
+
|
||||||
|
+/* Port status registers */
|
||||||
|
+#define ESS_PORT0_STATUS 0x007C
|
||||||
|
+#define ESS_PORT1_STATUS 0x0080
|
||||||
|
+#define ESS_PORT2_STATUS 0x0084
|
||||||
|
+#define ESS_PORT3_STATUS 0x0088
|
||||||
|
+#define ESS_PORT4_STATUS 0x008C
|
||||||
|
+#define ESS_PORT5_STATUS 0x0090
|
||||||
|
+
|
||||||
|
+#define ESS_PORT_STATUS_HDX_FLOW_CTL 0x80
|
||||||
|
+#define ESS_PORT_STATUS_DUPLEX_MODE 0x40
|
||||||
|
+#define ESS_PORT_STATUS_RX_FLOW_EN 0x20
|
||||||
|
+#define ESS_PORT_STATUS_TX_FLOW_EN 0x10
|
||||||
|
+#define ESS_PORT_STATUS_RX_MAC_EN 0x08
|
||||||
|
+#define ESS_PORT_STATUS_TX_MAC_EN 0x04
|
||||||
|
+#define ESS_PORT_STATUS_SPEED_INV 0x03
|
||||||
|
+#define ESS_PORT_STATUS_SPEED_1000 0x02
|
||||||
|
+#define ESS_PORT_STATUS_SPEED_100 0x01
|
||||||
|
+#define ESS_PORT_STATUS_SPEED_10 0x00
|
||||||
|
+
|
||||||
|
+#define ESS_PORT_1G_FDX (ESS_PORT_STATUS_DUPLEX_MODE | ESS_PORT_STATUS_RX_FLOW_EN | \
|
||||||
|
+ ESS_PORT_STATUS_TX_FLOW_EN | ESS_PORT_STATUS_RX_MAC_EN | \
|
||||||
|
+ ESS_PORT_STATUS_TX_MAC_EN | ESS_PORT_STATUS_SPEED_1000)
|
||||||
|
+
|
||||||
|
+#define PHY_STATUS_REG 0x11
|
||||||
|
+#define PHY_STATUS_SPEED 0xC000
|
||||||
|
+#define PHY_STATUS_SPEED_SHIFT 14
|
||||||
|
+#define PHY_STATUS_DUPLEX 0x2000
|
||||||
|
+#define PHY_STATUS_DUPLEX_SHIFT 13
|
||||||
|
+#define PHY_STATUS_SPEED_DUPLEX_RESOLVED 0x0800
|
||||||
|
+#define PHY_STATUS_CARRIER 0x0400
|
||||||
|
+#define PHY_STATUS_CARRIER_SHIFT 10
|
||||||
|
+
|
||||||
|
+/* Port lookup control registers */
|
||||||
|
+#define ESS_PORT0_LOOKUP_CTRL 0x0660
|
||||||
|
+#define ESS_PORT1_LOOKUP_CTRL 0x066C
|
||||||
|
+#define ESS_PORT2_LOOKUP_CTRL 0x0678
|
||||||
|
+#define ESS_PORT3_LOOKUP_CTRL 0x0684
|
||||||
|
+#define ESS_PORT4_LOOKUP_CTRL 0x0690
|
||||||
|
+#define ESS_PORT5_LOOKUP_CTRL 0x069C
|
||||||
|
+
|
||||||
|
+#define ESS_PORT0_HEADER_CTRL 0x009C
|
||||||
|
+
|
||||||
|
+#define ESS_PORTS_ALL 0x3f
|
||||||
|
+
|
||||||
|
+#define ESS_FWD_CTRL1 0x0624
|
||||||
|
+#define ESS_FWD_CTRL1_UC_FLOOD BITS(0, 7)
|
||||||
|
+#define ESS_FWD_CTRL1_UC_FLOOD_S 0
|
||||||
|
+#define ESS_FWD_CTRL1_MC_FLOOD BITS(8, 7)
|
||||||
|
+#define ESS_FWD_CTRL1_MC_FLOOD_S 8
|
||||||
|
+#define ESS_FWD_CTRL1_BC_FLOOD BITS(16, 7)
|
||||||
|
+#define ESS_FWD_CTRL1_BC_FLOOD_S 16
|
||||||
|
+#define ESS_FWD_CTRL1_IGMP BITS(24, 7)
|
||||||
|
+#define ESS_FWD_CTRL1_IGMP_S 24
|
||||||
|
+
|
||||||
|
#endif /* _ESS_EDMA_H_ */
|
@ -0,0 +1,21 @@
|
|||||||
|
From 17681f0bb474d0d227f07369144149d1555d8bce Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chen Minqiang <ptpt52@gmail.com>
|
||||||
|
Date: Sun, 17 Jun 2018 04:14:13 +0800
|
||||||
|
Subject: [PATCH] essedma: alloc skb ip align
|
||||||
|
|
||||||
|
Signed-off-by: Chen Minqiang <ptpt52@gmail.com>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/qualcomm/essedma/edma.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/qualcomm/essedma/edma.c
|
||||||
|
+++ b/drivers/net/ethernet/qualcomm/essedma/edma.c
|
||||||
|
@@ -201,7 +201,7 @@ static int edma_alloc_rx_buf(struct edma
|
||||||
|
skb = sw_desc->skb;
|
||||||
|
} else {
|
||||||
|
/* alloc skb */
|
||||||
|
- skb = netdev_alloc_skb(edma_netdev[0], length);
|
||||||
|
+ skb = netdev_alloc_skb_ip_align(edma_netdev[0], length);
|
||||||
|
if (!skb) {
|
||||||
|
/* Better luck next round */
|
||||||
|
break;
|
@ -0,0 +1,180 @@
|
|||||||
|
From: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
|
Subject: SoC: add qualcomm syscon
|
||||||
|
--- a/drivers/soc/qcom/Makefile
|
||||||
|
+++ b/drivers/soc/qcom/Makefile
|
||||||
|
@@ -18,6 +18,7 @@ obj-$(CONFIG_QCOM_SMEM_STATE) += smem_st
|
||||||
|
obj-$(CONFIG_QCOM_SMP2P) += smp2p.o
|
||||||
|
obj-$(CONFIG_QCOM_SMSM) += smsm.o
|
||||||
|
obj-$(CONFIG_QCOM_WCNSS_CTRL) += wcnss_ctrl.o
|
||||||
|
+obj-$(CONFIG_QCOM_TCSR) += qcom_tcsr.o
|
||||||
|
obj-$(CONFIG_QCOM_APR) += apr.o
|
||||||
|
obj-$(CONFIG_QCOM_LLCC) += llcc-slice.o
|
||||||
|
obj-$(CONFIG_QCOM_SDM845_LLCC) += llcc-sdm845.o
|
||||||
|
--- a/drivers/soc/qcom/Kconfig
|
||||||
|
+++ b/drivers/soc/qcom/Kconfig
|
||||||
|
@@ -146,6 +146,13 @@ config QCOM_SMSM
|
||||||
|
Say yes here to support the Qualcomm Shared Memory State Machine.
|
||||||
|
The state machine is represented by bits in shared memory.
|
||||||
|
|
||||||
|
+config QCOM_TCSR
|
||||||
|
+ tristate "QCOM Top Control and Status Registers"
|
||||||
|
+ depends on ARCH_QCOM
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable TCSR support. The TCSR provides control
|
||||||
|
+ functions for various peripherals.
|
||||||
|
+
|
||||||
|
config QCOM_WCNSS_CTRL
|
||||||
|
tristate "Qualcomm WCNSS control driver"
|
||||||
|
depends on ARCH_QCOM
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/soc/qcom/qcom_tcsr.c
|
||||||
|
@@ -0,0 +1,98 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2014, The Linux foundation. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License rev 2 and
|
||||||
|
+ * only rev 2 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.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/err.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/of_platform.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+#define TCSR_USB_PORT_SEL 0xb0
|
||||||
|
+#define TCSR_USB_HSPHY_CONFIG 0xC
|
||||||
|
+
|
||||||
|
+#define TCSR_ESS_INTERFACE_SEL_OFFSET 0x0
|
||||||
|
+#define TCSR_ESS_INTERFACE_SEL_MASK 0xf
|
||||||
|
+
|
||||||
|
+#define TCSR_WIFI0_GLB_CFG_OFFSET 0x0
|
||||||
|
+#define TCSR_WIFI1_GLB_CFG_OFFSET 0x4
|
||||||
|
+#define TCSR_PNOC_SNOC_MEMTYPE_M0_M2 0x4
|
||||||
|
+
|
||||||
|
+static int tcsr_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct resource *res;
|
||||||
|
+ const struct device_node *node = pdev->dev.of_node;
|
||||||
|
+ void __iomem *base;
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
+ base = devm_ioremap_resource(&pdev->dev, res);
|
||||||
|
+ if (IS_ERR(base))
|
||||||
|
+ return PTR_ERR(base);
|
||||||
|
+
|
||||||
|
+ if (!of_property_read_u32(node, "qcom,usb-ctrl-select", &val)) {
|
||||||
|
+ dev_err(&pdev->dev, "setting usb port select = %d\n", val);
|
||||||
|
+ writel(val, base + TCSR_USB_PORT_SEL);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!of_property_read_u32(node, "qcom,usb-hsphy-mode-select", &val)) {
|
||||||
|
+ dev_info(&pdev->dev, "setting usb hs phy mode select = %x\n", val);
|
||||||
|
+ writel(val, base + TCSR_USB_HSPHY_CONFIG);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!of_property_read_u32(node, "qcom,ess-interface-select", &val)) {
|
||||||
|
+ u32 tmp = 0;
|
||||||
|
+ dev_info(&pdev->dev, "setting ess interface select = %x\n", val);
|
||||||
|
+ tmp = readl(base + TCSR_ESS_INTERFACE_SEL_OFFSET);
|
||||||
|
+ tmp = tmp & (~TCSR_ESS_INTERFACE_SEL_MASK);
|
||||||
|
+ tmp = tmp | (val&TCSR_ESS_INTERFACE_SEL_MASK);
|
||||||
|
+ writel(tmp, base + TCSR_ESS_INTERFACE_SEL_OFFSET);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!of_property_read_u32(node, "qcom,wifi_glb_cfg", &val)) {
|
||||||
|
+ dev_info(&pdev->dev, "setting wifi_glb_cfg = %x\n", val);
|
||||||
|
+ writel(val, base + TCSR_WIFI0_GLB_CFG_OFFSET);
|
||||||
|
+ writel(val, base + TCSR_WIFI1_GLB_CFG_OFFSET);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!of_property_read_u32(node, "qcom,wifi_noc_memtype_m0_m2", &val)) {
|
||||||
|
+ dev_info(&pdev->dev,
|
||||||
|
+ "setting wifi_noc_memtype_m0_m2 = %x\n", val);
|
||||||
|
+ writel(val, base + TCSR_PNOC_SNOC_MEMTYPE_M0_M2);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id tcsr_dt_match[] = {
|
||||||
|
+ { .compatible = "qcom,tcsr", },
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+MODULE_DEVICE_TABLE(of, tcsr_dt_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver tcsr_driver = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "tcsr",
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .of_match_table = tcsr_dt_match,
|
||||||
|
+ },
|
||||||
|
+ .probe = tcsr_probe,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+module_platform_driver(tcsr_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>");
|
||||||
|
+MODULE_DESCRIPTION("QCOM TCSR driver");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/dt-bindings/soc/qcom,tcsr.h
|
||||||
|
@@ -0,0 +1,48 @@
|
||||||
|
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2 and
|
||||||
|
+ * only version 2 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.
|
||||||
|
+ */
|
||||||
|
+#ifndef __DT_BINDINGS_QCOM_TCSR_H
|
||||||
|
+#define __DT_BINDINGS_QCOM_TCSR_H
|
||||||
|
+
|
||||||
|
+#define TCSR_USB_SELECT_USB3_P0 0x1
|
||||||
|
+#define TCSR_USB_SELECT_USB3_P1 0x2
|
||||||
|
+#define TCSR_USB_SELECT_USB3_DUAL 0x3
|
||||||
|
+
|
||||||
|
+/* IPQ40xx HS PHY Mode Select */
|
||||||
|
+#define TCSR_USB_HSPHY_HOST_MODE 0x00E700E7
|
||||||
|
+#define TCSR_USB_HSPHY_DEVICE_MODE 0x00C700E7
|
||||||
|
+
|
||||||
|
+/* IPQ40xx ess interface mode select */
|
||||||
|
+#define TCSR_ESS_PSGMII 0
|
||||||
|
+#define TCSR_ESS_PSGMII_RGMII5 1
|
||||||
|
+#define TCSR_ESS_PSGMII_RMII0 2
|
||||||
|
+#define TCSR_ESS_PSGMII_RMII1 4
|
||||||
|
+#define TCSR_ESS_PSGMII_RMII0_RMII1 6
|
||||||
|
+#define TCSR_ESS_PSGMII_RGMII4 9
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * IPQ40xx WiFi Global Config
|
||||||
|
+ * Bit 30:AXID_EN
|
||||||
|
+ * Enable AXI master bus Axid translating to confirm all txn submitted by order
|
||||||
|
+ * Bit 24: Use locally generated socslv_wxi_bvalid
|
||||||
|
+ * 1: use locally generate socslv_wxi_bvalid for performance.
|
||||||
|
+ * 0: use SNOC socslv_wxi_bvalid.
|
||||||
|
+ */
|
||||||
|
+#define TCSR_WIFI_GLB_CFG 0x41000000
|
||||||
|
+
|
||||||
|
+/* IPQ40xx MEM_TYPE_SEL_M0_M2 Select Bit 26:24 - 2 NORMAL */
|
||||||
|
+#define TCSR_WIFI_NOC_MEMTYPE_M0_M2 0x02222222
|
||||||
|
+
|
||||||
|
+/* TCSR A/B REG */
|
||||||
|
+#define IPQ806X_TCSR_REG_A_ADM_CRCI_MUX_SEL 0
|
||||||
|
+#define IPQ806X_TCSR_REG_B_ADM_CRCI_MUX_SEL 1
|
||||||
|
+
|
||||||
|
+#endif
|
@ -0,0 +1,157 @@
|
|||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1.dtsi
|
||||||
|
@@ -15,6 +15,7 @@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qcom-ipq4019.dtsi"
|
||||||
|
+#include <dt-bindings/soc/qcom,tcsr.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Qualcomm Technologies, Inc. IPQ4019/AP-DK01.1";
|
||||||
|
@@ -29,6 +30,32 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
+ tcsr@194b000 {
|
||||||
|
+ /* select hostmode */
|
||||||
|
+ compatible = "qcom,tcsr";
|
||||||
|
+ reg = <0x194b000 0x100>;
|
||||||
|
+ qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
|
||||||
|
+ status = "ok";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ess_tcsr@1953000 {
|
||||||
|
+ compatible = "qcom,tcsr";
|
||||||
|
+ reg = <0x1953000 0x1000>;
|
||||||
|
+ qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tcsr@1949000 {
|
||||||
|
+ compatible = "qcom,tcsr";
|
||||||
|
+ reg = <0x1949000 0x100>;
|
||||||
|
+ qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ tcsr@1957000 {
|
||||||
|
+ compatible = "qcom,tcsr";
|
||||||
|
+ reg = <0x1957000 0x100>;
|
||||||
|
+ qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
rng@22000 {
|
||||||
|
status = "ok";
|
||||||
|
};
|
||||||
|
@@ -74,14 +101,6 @@
|
||||||
|
pinctrl-names = "default";
|
||||||
|
status = "ok";
|
||||||
|
cs-gpios = <&tlmm 54 0>;
|
||||||
|
-
|
||||||
|
- mx25l25635e@0 {
|
||||||
|
- #address-cells = <1>;
|
||||||
|
- #size-cells = <1>;
|
||||||
|
- reg = <0>;
|
||||||
|
- compatible = "mx25l25635e";
|
||||||
|
- spi-max-frequency = <24000000>;
|
||||||
|
- };
|
||||||
|
};
|
||||||
|
|
||||||
|
serial@78af000 {
|
||||||
|
@@ -110,6 +129,22 @@
|
||||||
|
status = "ok";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ mdio@90000 {
|
||||||
|
+ status = "okay";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ess-switch@c000000 {
|
||||||
|
+ status = "okay";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ess-psgmii@98000 {
|
||||||
|
+ status = "okay";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ edma@c080000 {
|
||||||
|
+ status = "okay";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
usb3_ss_phy: ssphy@9a000 {
|
||||||
|
status = "ok";
|
||||||
|
};
|
||||||
|
--- a/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1-c1.dts
|
||||||
|
+++ b/arch/arm/boot/dts/qcom-ipq4019-ap.dk01.1-c1.dts
|
||||||
|
@@ -18,5 +18,73 @@
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Qualcomm Technologies, Inc. IPQ40xx/AP-DK01.1-C1";
|
||||||
|
+ compatible = "qcom,ap-dk01.1-c1", "qcom,ap-dk01.2-c1", "qcom,ipq4019";
|
||||||
|
|
||||||
|
+ memory {
|
||||||
|
+ device_type = "memory";
|
||||||
|
+ reg = <0x80000000 0x10000000>;
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&blsp1_spi1 {
|
||||||
|
+ mx25l25635f@0 {
|
||||||
|
+ compatible = "mx25l25635f", "jedec,spi-nor";
|
||||||
|
+ #address-cells = <1>;
|
||||||
|
+ #size-cells = <1>;
|
||||||
|
+ reg = <0>;
|
||||||
|
+ spi-max-frequency = <24000000>;
|
||||||
|
+
|
||||||
|
+ SBL1@0 {
|
||||||
|
+ label = "SBL1";
|
||||||
|
+ reg = <0x0 0x40000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ MIBIB@40000 {
|
||||||
|
+ label = "MIBIB";
|
||||||
|
+ reg = <0x40000 0x20000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ QSEE@60000 {
|
||||||
|
+ label = "QSEE";
|
||||||
|
+ reg = <0x60000 0x60000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ CDT@c0000 {
|
||||||
|
+ label = "CDT";
|
||||||
|
+ reg = <0xc0000 0x10000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ DDRPARAMS@d0000 {
|
||||||
|
+ label = "DDRPARAMS";
|
||||||
|
+ reg = <0xd0000 0x10000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ APPSBLENV@e0000 {
|
||||||
|
+ label = "APPSBLENV";
|
||||||
|
+ reg = <0xe0000 0x10000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ APPSBL@f0000 {
|
||||||
|
+ label = "APPSBL";
|
||||||
|
+ reg = <0xf0000 0x80000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ ART@170000 {
|
||||||
|
+ label = "ART";
|
||||||
|
+ reg = <0x170000 0x10000>;
|
||||||
|
+ read-only;
|
||||||
|
+ };
|
||||||
|
+ kernel@180000 {
|
||||||
|
+ label = "kernel";
|
||||||
|
+ reg = <0x180000 0x400000>;
|
||||||
|
+ };
|
||||||
|
+ rootfs@580000 {
|
||||||
|
+ label = "rootfs";
|
||||||
|
+ reg = <0x580000 0x1600000>;
|
||||||
|
+ };
|
||||||
|
+ firmware@180000 {
|
||||||
|
+ label = "firmware";
|
||||||
|
+ reg = <0x180000 0x1a00000>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
};
|
@ -0,0 +1,37 @@
|
|||||||
|
From 8f68331e14dff9a101f2d0e1d6bec84a031f27ee Mon Sep 17 00:00:00 2001
|
||||||
|
From: John Crispin <john@phrozen.org>
|
||||||
|
Date: Thu, 9 Mar 2017 11:03:18 +0100
|
||||||
|
Subject: [PATCH 69/69] arm: boot: add dts files
|
||||||
|
|
||||||
|
Signed-off-by: John Crispin <john@phrozen.org>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/Makefile | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/boot/dts/Makefile
|
||||||
|
+++ b/arch/arm/boot/dts/Makefile
|
||||||
|
@@ -785,11 +785,24 @@ dtb-$(CONFIG_ARCH_QCOM) += \
|
||||||
|
qcom-apq8074-dragonboard.dtb \
|
||||||
|
qcom-apq8084-ifc6540.dtb \
|
||||||
|
qcom-apq8084-mtp.dtb \
|
||||||
|
+ qcom-ipq4018-a42.dtb \
|
||||||
|
+ qcom-ipq4018-eap1300.dtb \
|
||||||
|
+ qcom-ipq4018-ex6100v2.dtb \
|
||||||
|
+ qcom-ipq4018-ex6150v2.dtb \
|
||||||
|
+ qcom-ipq4018-fritz4040.dtb \
|
||||||
|
+ qcom-ipq4018-jalapeno.dtb \
|
||||||
|
+ qcom-ipq4018-nbg6617.dtb \
|
||||||
|
+ qcom-ipq4018-rt-ac58u.dtb \
|
||||||
|
+ qcom-ipq4018-wre6606.dtb \
|
||||||
|
qcom-ipq4019-ap.dk01.1-c1.dtb \
|
||||||
|
qcom-ipq4019-ap.dk04.1-c1.dtb \
|
||||||
|
qcom-ipq4019-ap.dk04.1-c3.dtb \
|
||||||
|
qcom-ipq4019-ap.dk07.1-c1.dtb \
|
||||||
|
qcom-ipq4019-ap.dk07.1-c2.dtb \
|
||||||
|
+ qcom-ipq4019-a62.dtb \
|
||||||
|
+ qcom-ipq4028-wpj428.dtb \
|
||||||
|
+ qcom-ipq4029-gl-b1300.dtb \
|
||||||
|
+ qcom-ipq4029-mr33.dtb \
|
||||||
|
qcom-ipq8064-ap148.dtb \
|
||||||
|
qcom-msm8660-surf.dtb \
|
||||||
|
qcom-msm8960-cdp.dtb \
|
@ -0,0 +1,12 @@
|
|||||||
|
--- a/drivers/of/fdt.c
|
||||||
|
+++ b/drivers/of/fdt.c
|
||||||
|
@@ -1090,6 +1090,9 @@ int __init early_init_dt_scan_chosen(uns
|
||||||
|
p = of_get_flat_dt_prop(node, "bootargs", &l);
|
||||||
|
if (p != NULL && l > 0)
|
||||||
|
strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE));
|
||||||
|
+ p = of_get_flat_dt_prop(node, "bootargs-append", &l);
|
||||||
|
+ if (p != NULL && l > 0)
|
||||||
|
+ strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CONFIG_CMDLINE is meant to be a default in case nothing else
|
Loading…
Reference in New Issue
Block a user