mirror of
https://github.com/armbian/build.git
synced 2026-01-06 09:58:46 -08:00
Fix odroid (#1795)
* Address Odroid XU4 current stability issues. (#1766) * Address stability issues, update configuration. * Cleanup - remove not needed patches * Add upstream patches Board survived regular stress testing while previous config/version hanged instantly. * Upstream patches for a few legacy kernels Co-authored-by: Igor Pečovnik <igorpecovnik@users.noreply.github.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 4.9.205 Kernel Configuration
|
||||
# Linux/arm64 4.9.210 Kernel Configuration
|
||||
#
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_64BIT=y
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm 4.14.162 Kernel Configuration
|
||||
# Linux/arm 4.14.167 Kernel Configuration
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 4.4.208 Kernel Configuration
|
||||
# Linux/arm64 4.4.211 Kernel Configuration
|
||||
#
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_64BIT=y
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm 4.4.208 Kernel Configuration
|
||||
# Linux/arm 4.4.211 Kernel Configuration
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 4.4.207 Kernel Configuration
|
||||
# Linux/arm64 4.4.211 Kernel Configuration
|
||||
#
|
||||
CONFIG_ARM64=y
|
||||
CONFIG_64BIT=y
|
||||
|
||||
@@ -17,12 +17,15 @@ case $BRANCH in
|
||||
|
||||
;;
|
||||
|
||||
current|dev)
|
||||
current)
|
||||
|
||||
KERNELSOURCE='https://github.com/mihailescu2m/linux'
|
||||
KERNELBRANCH='branch:odroidxu4-5.4.y'
|
||||
KERNELDIR='linux-odroidxu4'
|
||||
;;
|
||||
|
||||
dev)
|
||||
KERNELBRANCH='branch:linux-5.5.y'
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From: Colin Ian King <colin.king@canonical.com>
|
||||
|
||||
The multiplication of opp_freq by MHZ is performed using unsigned int
|
||||
multiplication however the result is being passed into a function where
|
||||
the frequency is an unsigned long, so there is an expectation that the
|
||||
result won't fit into an unsigned int. Fix any potential integer overflow
|
||||
my making opp_freq an unsigned long. Also change from %u to %lu format
|
||||
specifiers
|
||||
|
||||
Addresses-Coverity: ("Unintentional integer overflow")
|
||||
Fixes: 5ea428595cc5 ("soc: samsung: Add Exynos Adaptive Supply Voltage driver")
|
||||
Signed-off-by: Colin Ian King <colin.king@canonical.com>
|
||||
---
|
||||
drivers/soc/samsung/exynos-asv.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/soc/samsung/exynos-asv.c b/drivers/soc/samsung/exynos-asv.c
|
||||
index 8abf4dfaa5c5..d66fc74379a3 100644
|
||||
--- a/drivers/soc/samsung/exynos-asv.c
|
||||
+++ b/drivers/soc/samsung/exynos-asv.c
|
||||
@@ -30,7 +30,7 @@ static int exynos_asv_update_cpu_opps(struct exynos_asv *asv,
|
||||
{
|
||||
struct exynos_asv_subsys *subsys = NULL;
|
||||
struct dev_pm_opp *opp;
|
||||
- unsigned int opp_freq;
|
||||
+ unsigned long opp_freq;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(asv->subsys); i++) {
|
||||
@@ -51,7 +51,7 @@ static int exynos_asv_update_cpu_opps(struct exynos_asv *asv,
|
||||
|
||||
opp = dev_pm_opp_find_freq_exact(cpu, opp_freq * MHZ, true);
|
||||
if (IS_ERR(opp)) {
|
||||
- dev_info(asv->dev, "cpu%d opp%d, freq: %u missing\n",
|
||||
+ dev_info(asv->dev, "cpu%d opp%d, freq: %lu missing\n",
|
||||
cpu->id, i, opp_freq);
|
||||
|
||||
continue;
|
||||
@@ -68,11 +68,11 @@ static int exynos_asv_update_cpu_opps(struct exynos_asv *asv,
|
||||
new_volt, new_volt, new_volt);
|
||||
if (ret < 0)
|
||||
dev_err(asv->dev,
|
||||
- "Failed to adjust OPP %u Hz/%u uV for cpu%d\n",
|
||||
+ "Failed to adjust OPP %lu Hz/%u uV for cpu%d\n",
|
||||
opp_freq, new_volt, cpu->id);
|
||||
else
|
||||
dev_dbg(asv->dev,
|
||||
- "Adjusted OPP %u Hz/%u -> %u uV, cpu%d\n",
|
||||
+ "Adjusted OPP %lu Hz/%u -> %u uV, cpu%d\n",
|
||||
opp_freq, volt, new_volt, cpu->id);
|
||||
}
|
||||
|
||||
271
patch/kernel/odroidxu4-current/0003-add-yaml-DWC2-bindings.patch
Normal file
271
patch/kernel/odroidxu4-current/0003-add-yaml-DWC2-bindings.patch
Normal file
@@ -0,0 +1,271 @@
|
||||
Convert DWC2 bindings to DT schema format using json-schema.
|
||||
DWC2 is widely use but a couple of compatibles and properties
|
||||
(vusb_d-supply,vusb_a-supply) were missing in dwc2.txt, the
|
||||
patch add them.
|
||||
|
||||
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@st.com>
|
||||
---
|
||||
CC: Minas Harutyunyan <hminas@synopsys.com>
|
||||
|
||||
changes in version 2:
|
||||
- put Minas Harutyunyan <hminas@synopsys.com> as maintainer
|
||||
- remove type and description from phy property
|
||||
- remove description from compatible items
|
||||
- simplify samsung,s3c6400-hsotg compatible handling
|
||||
|
||||
Documentation/devicetree/bindings/usb/dwc2.txt | 64 ----------
|
||||
Documentation/devicetree/bindings/usb/dwc2.yaml | 152 ++++++++++++++++++++++++
|
||||
2 files changed, 152 insertions(+), 64 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/usb/dwc2.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/usb/dwc2.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/usb/dwc2.txt b/Documentation/devicetree/bindings/usb/dwc2.txt
|
||||
deleted file mode 100644
|
||||
index aafff3a6904d..000000000000
|
||||
--- a/Documentation/devicetree/bindings/usb/dwc2.txt
|
||||
+++ /dev/null
|
||||
@@ -1,64 +0,0 @@
|
||||
-Platform DesignWare HS OTG USB 2.0 controller
|
||||
------------------------------------------------------
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible : One of:
|
||||
- - brcm,bcm2835-usb: The DWC2 USB controller instance in the BCM2835 SoC.
|
||||
- - hisilicon,hi6220-usb: The DWC2 USB controller instance in the hi6220 SoC.
|
||||
- - rockchip,rk3066-usb: The DWC2 USB controller instance in the rk3066 Soc;
|
||||
- - "rockchip,px30-usb", "rockchip,rk3066-usb", "snps,dwc2": for px30 Soc;
|
||||
- - "rockchip,rk3188-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3188 Soc;
|
||||
- - "rockchip,rk3288-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3288 Soc;
|
||||
- - "lantiq,arx100-usb": The DWC2 USB controller instance in Lantiq ARX SoCs;
|
||||
- - "lantiq,xrx200-usb": The DWC2 USB controller instance in Lantiq XRX SoCs;
|
||||
- - "amlogic,meson8-usb": The DWC2 USB controller instance in Amlogic Meson8 SoCs;
|
||||
- - "amlogic,meson8b-usb": The DWC2 USB controller instance in Amlogic Meson8b SoCs;
|
||||
- - "amlogic,meson-gxbb-usb": The DWC2 USB controller instance in Amlogic S905 SoCs;
|
||||
- - "amlogic,meson-g12a-usb": The DWC2 USB controller instance in Amlogic G12A SoCs;
|
||||
- - "amcc,dwc-otg": The DWC2 USB controller instance in AMCC Canyonlands 460EX SoCs;
|
||||
- - snps,dwc2: A generic DWC2 USB controller with default parameters.
|
||||
- - "st,stm32f4x9-fsotg": The DWC2 USB FS/HS controller instance in STM32F4x9 SoCs
|
||||
- configured in FS mode;
|
||||
- - "st,stm32f4x9-hsotg": The DWC2 USB HS controller instance in STM32F4x9 SoCs
|
||||
- configured in HS mode;
|
||||
- - "st,stm32f7-hsotg": The DWC2 USB HS controller instance in STM32F7 SoCs
|
||||
- configured in HS mode;
|
||||
-- reg : Should contain 1 register range (address and length)
|
||||
-- interrupts : Should contain 1 interrupt
|
||||
-- clocks: clock provider specifier
|
||||
-- clock-names: shall be "otg"
|
||||
-Refer to clk/clock-bindings.txt for generic clock consumer properties
|
||||
-
|
||||
-Optional properties:
|
||||
-- phys: phy provider specifier
|
||||
-- phy-names: shall be "usb2-phy"
|
||||
-- vbus-supply: reference to the VBUS regulator. Depending on the current mode
|
||||
- this is enabled (in "host" mode") or disabled (in "peripheral" mode). The
|
||||
- regulator is updated if the controller is configured in "otg" mode and the
|
||||
- status changes between "host" and "peripheral".
|
||||
-Refer to phy/phy-bindings.txt for generic phy consumer properties
|
||||
-- dr_mode: shall be one of "host", "peripheral" and "otg"
|
||||
- Refer to usb/generic.txt
|
||||
-- g-rx-fifo-size: size of rx fifo size in gadget mode.
|
||||
-- g-np-tx-fifo-size: size of non-periodic tx fifo size in gadget mode.
|
||||
-- g-tx-fifo-size: size of periodic tx fifo per endpoint (except ep0) in gadget mode.
|
||||
-- snps,need-phy-for-wake: If present indicates that the phy needs to be left
|
||||
- on for remote wakeup during suspend.
|
||||
-- snps,reset-phy-on-wake: If present indicates that we need to reset the PHY when
|
||||
- we detect a wakeup. This is due to a hardware errata.
|
||||
-
|
||||
-Deprecated properties:
|
||||
-- g-use-dma: gadget DMA mode is automatically detected
|
||||
-
|
||||
-Example:
|
||||
-
|
||||
- usb@101c0000 {
|
||||
- compatible = "ralink,rt3050-usb, snps,dwc2";
|
||||
- reg = <0x101c0000 40000>;
|
||||
- interrupts = <18>;
|
||||
- clocks = <&usb_otg_ahb_clk>;
|
||||
- clock-names = "otg";
|
||||
- phys = <&usbphy>;
|
||||
- phy-names = "usb2-phy";
|
||||
- snps,need-phy-for-wake;
|
||||
- };
|
||||
diff --git a/Documentation/devicetree/bindings/usb/dwc2.yaml b/Documentation/devicetree/bindings/usb/dwc2.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..e29dfcd2466c
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/usb/dwc2.yaml
|
||||
@@ -0,0 +1,152 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/usb/dwc2.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: DesignWare HS OTG USB 2.0 controller Bindings
|
||||
+
|
||||
+maintainers:
|
||||
+ - Minas Harutyunyan <hminas@synopsys.com>
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ oneOf:
|
||||
+ - const: brcm,bcm2835-usb
|
||||
+ - const: hisilicon,hi6220-usb
|
||||
+ - items:
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: rockchip,px30-usb
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: rockchip,rk3036-usb
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: rockchip,rv1108-usb
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: rockchip,rk3188-usb
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: rockchip,rk3228-usb
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: rockchip,rk3288-usb
|
||||
+ - const: rockchip,rk3066-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - const: lantiq,arx100-usb
|
||||
+ - const: lantiq,xrx200-usb
|
||||
+ - items:
|
||||
+ - const: amlogic,meson8-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - items:
|
||||
+ - const: amlogic,meson8b-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - const: amlogic,meson-gxbb-usb
|
||||
+ - items:
|
||||
+ - const: amlogic,meson-g12a-usb
|
||||
+ - const: snps,dwc2
|
||||
+ - const: amcc,dwc-otg
|
||||
+ - const: snps,dwc2
|
||||
+ - const: st,stm32f4x9-fsotg
|
||||
+ - const: st,stm32f4x9-hsotg
|
||||
+ - const: st,stm32f7-hsotg
|
||||
+ - const: samsung,s3c6400-hsotg
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ interrupts:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ clocks:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: otg
|
||||
+
|
||||
+ resets:
|
||||
+ items:
|
||||
+ - description: common reset
|
||||
+ - description: ecc reset
|
||||
+ minItems: 1
|
||||
+
|
||||
+ reset-names:
|
||||
+ items:
|
||||
+ - const: dwc2
|
||||
+ - const: dwc2-ecc
|
||||
+ minItems: 1
|
||||
+
|
||||
+ phys:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ phy-names:
|
||||
+ const: usb2-phy
|
||||
+
|
||||
+ vbus-supply:
|
||||
+ description: reference to the VBUS regulator. Depending on the current mode
|
||||
+ this is enabled (in "host" mode") or disabled (in "peripheral" mode). The
|
||||
+ regulator is updated if the controller is configured in "otg" mode and the
|
||||
+ status changes between "host" and "peripheral".
|
||||
+
|
||||
+ vusb_d-supply:
|
||||
+ description: phandle to voltage regulator of digital section,
|
||||
+
|
||||
+ vusb_a-supply:
|
||||
+ description: phandle to voltage regulator of analog section.
|
||||
+
|
||||
+ dr_mode:
|
||||
+ enum: [host, peripheral, otg]
|
||||
+
|
||||
+ g-rx-fifo-size:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: size of rx fifo size in gadget mode.
|
||||
+
|
||||
+ g-np-tx-fifo-size:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32
|
||||
+ description: size of non-periodic tx fifo size in gadget mode.
|
||||
+
|
||||
+ g-tx-fifo-size:
|
||||
+ $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
+ description: size of periodic tx fifo per endpoint (except ep0) in gadget mode.
|
||||
+
|
||||
+ snps,need-phy-for-wake:
|
||||
+ $ref: /schemas/types.yaml#/definitions/flag
|
||||
+ description: If present indicates that the phy needs to be left on for remote wakeup during suspend.
|
||||
+
|
||||
+ snps,reset-phy-on-wake:
|
||||
+ $ref: /schemas/types.yaml#/definitions/flag
|
||||
+ description: If present indicates that we need to reset the PHY when we detect a wakeup.
|
||||
+ This is due to a hardware errata.
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - interrupts
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ usb@101c0000 {
|
||||
+ compatible = "ralink,rt3050-usb, snps,dwc2";
|
||||
+ reg = <0x101c0000 40000>;
|
||||
+ interrupts = <18>;
|
||||
+ clocks = <&usb_otg_ahb_clk>;
|
||||
+ clock-names = "otg";
|
||||
+ phys = <&usbphy>;
|
||||
+ phy-names = "usb2-phy";
|
||||
+ snps,need-phy-for-wake;
|
||||
+ };
|
||||
+
|
||||
+...
|
||||
|
||||
Remove "snps,dwc2" from hsotg@12480000 node compatible list because
|
||||
"samsung,s3c6400-hsotg" should be enough.
|
||||
|
||||
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@st.com>
|
||||
---
|
||||
arch/arm/boot/dts/exynos3250.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/exynos3250.dtsi b/arch/arm/boot/dts/exynos3250.dtsi
|
||||
index b016b0b68306..d4866269f4ee 100644
|
||||
--- a/arch/arm/boot/dts/exynos3250.dtsi
|
||||
+++ b/arch/arm/boot/dts/exynos3250.dtsi
|
||||
@@ -362,7 +362,7 @@
|
||||
};
|
||||
|
||||
hsotg: hsotg@12480000 {
|
||||
- compatible = "samsung,s3c6400-hsotg", "snps,dwc2";
|
||||
+ compatible = "samsung,s3c6400-hsotg";
|
||||
reg = <0x12480000 0x20000>;
|
||||
interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cmu CLK_USBOTG>;
|
||||
2421
patch/kernel/odroidxu4-current/03-patch-5.4.11-12.patch
Normal file
2421
patch/kernel/odroidxu4-current/03-patch-5.4.11-12.patch
Normal file
File diff suppressed because it is too large
Load Diff
8010
patch/kernel/odroidxu4-current/03-patch-5.4.12-13.patch
Normal file
8010
patch/kernel/odroidxu4-current/03-patch-5.4.12-13.patch
Normal file
File diff suppressed because it is too large
Load Diff
8137
patch/kernel/odroidxu4-current/03-patch-5.4.13-14.patch
Normal file
8137
patch/kernel/odroidxu4-current/03-patch-5.4.13-14.patch
Normal file
File diff suppressed because it is too large
Load Diff
4477
patch/kernel/odroidxu4-current/03-patch-5.4.14-15.patch
Normal file
4477
patch/kernel/odroidxu4-current/03-patch-5.4.14-15.patch
Normal file
File diff suppressed because it is too large
Load Diff
5662
patch/kernel/odroidxu4-current/03-patch-5.4.15-16.patch
Normal file
5662
patch/kernel/odroidxu4-current/03-patch-5.4.15-16.patch
Normal file
File diff suppressed because it is too large
Load Diff
4118
patch/kernel/odroidxu4-current/03-patch-5.4.16-17.patch
Normal file
4118
patch/kernel/odroidxu4-current/03-patch-5.4.16-17.patch
Normal file
File diff suppressed because it is too large
Load Diff
269
patch/kernel/odroidxu4-current/dvfs-fixes.patch
Normal file
269
patch/kernel/odroidxu4-current/dvfs-fixes.patch
Normal file
@@ -0,0 +1,269 @@
|
||||
diff --git a/drivers/devfreq/exynos-bus.c b/drivers/devfreq/exynos-bus.c
|
||||
index 37bd34d56..8fa8eb541 100644
|
||||
--- a/drivers/devfreq/exynos-bus.c
|
||||
+++ b/drivers/devfreq/exynos-bus.c
|
||||
@@ -15,11 +15,10 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/module.h>
|
||||
-#include <linux/of_device.h>
|
||||
+#include <linux/of.h>
|
||||
#include <linux/pm_opp.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
-#include <linux/slab.h>
|
||||
|
||||
#define DEFAULT_SATURATION_RATIO 40
|
||||
|
||||
@@ -127,6 +126,7 @@ static int exynos_bus_get_dev_status(struct device *dev,
|
||||
|
||||
ret = exynos_bus_get_event(bus, &edata);
|
||||
if (ret < 0) {
|
||||
+ dev_err(dev, "failed to get event from devfreq-event devices\n");
|
||||
stat->total_time = stat->busy_time = 0;
|
||||
goto err;
|
||||
}
|
||||
@@ -243,7 +243,7 @@ static int exynos_bus_parse_of(struct device_node *np,
|
||||
{
|
||||
struct device *dev = bus->dev;
|
||||
struct dev_pm_opp *opp;
|
||||
- unsigned long rate, opp_rate;
|
||||
+ unsigned long rate;
|
||||
int ret;
|
||||
|
||||
/* Get the clock to provide each bus with source clock */
|
||||
@@ -267,21 +267,13 @@ static int exynos_bus_parse_of(struct device_node *np,
|
||||
}
|
||||
|
||||
rate = clk_get_rate(bus->clk);
|
||||
- opp_rate = rate;
|
||||
- opp = devfreq_recommended_opp(dev, &opp_rate, 0);
|
||||
+
|
||||
+ opp = devfreq_recommended_opp(dev, &rate, 0);
|
||||
if (IS_ERR(opp)) {
|
||||
dev_err(dev, "failed to find dev_pm_opp\n");
|
||||
ret = PTR_ERR(opp);
|
||||
goto err_opp;
|
||||
}
|
||||
- /*
|
||||
- * FIXME: U-boot leaves clock source at incorrect PLL, this results
|
||||
- * in clock rate outside defined OPP rate. Work around this bug by
|
||||
- * setting clock rate to recommended one.
|
||||
- */
|
||||
- if (rate > opp_rate)
|
||||
- clk_set_rate(bus->clk, opp_rate);
|
||||
-
|
||||
bus->curr_freq = dev_pm_opp_get_freq(opp);
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
@@ -295,52 +287,12 @@ static int exynos_bus_parse_of(struct device_node *np,
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int exynos_bus_probe(struct platform_device *pdev)
|
||||
+static int exynos_bus_profile_init(struct exynos_bus *bus,
|
||||
+ struct devfreq_dev_profile *profile)
|
||||
{
|
||||
- struct device *dev = &pdev->dev;
|
||||
- struct device_node *np = dev->of_node, *node;
|
||||
- struct devfreq_dev_profile *profile;
|
||||
+ struct device *dev = bus->dev;
|
||||
struct devfreq_simple_ondemand_data *ondemand_data;
|
||||
- struct devfreq_passive_data *passive_data;
|
||||
- struct devfreq *parent_devfreq;
|
||||
- struct exynos_bus *bus;
|
||||
- int ret, max_state;
|
||||
- unsigned long min_freq, max_freq;
|
||||
- bool passive = false;
|
||||
-
|
||||
- if (!np) {
|
||||
- dev_err(dev, "failed to find devicetree node\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL);
|
||||
- if (!bus)
|
||||
- return -ENOMEM;
|
||||
- mutex_init(&bus->lock);
|
||||
- bus->dev = &pdev->dev;
|
||||
- platform_set_drvdata(pdev, bus);
|
||||
-
|
||||
- profile = devm_kzalloc(dev, sizeof(*profile), GFP_KERNEL);
|
||||
- if (!profile)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- node = of_parse_phandle(dev->of_node, "devfreq", 0);
|
||||
- if (node) {
|
||||
- of_node_put(node);
|
||||
- passive = true;
|
||||
- } else {
|
||||
- ret = exynos_bus_parent_parse_of(np, bus);
|
||||
- if (ret < 0)
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- /* Parse the device-tree to get the resource information */
|
||||
- ret = exynos_bus_parse_of(np, bus);
|
||||
- if (ret < 0)
|
||||
- goto err_reg;
|
||||
-
|
||||
- if (passive)
|
||||
- goto passive;
|
||||
+ int ret;
|
||||
|
||||
/* Initialize the struct profile and governor data for parent device */
|
||||
profile->polling_ms = 50;
|
||||
@@ -349,10 +301,9 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
profile->exit = exynos_bus_exit;
|
||||
|
||||
ondemand_data = devm_kzalloc(dev, sizeof(*ondemand_data), GFP_KERNEL);
|
||||
- if (!ondemand_data) {
|
||||
- ret = -ENOMEM;
|
||||
- goto err;
|
||||
- }
|
||||
+ if (!ondemand_data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
ondemand_data->upthreshold = 40;
|
||||
ondemand_data->downdifferential = 5;
|
||||
|
||||
@@ -362,15 +313,14 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
ondemand_data);
|
||||
if (IS_ERR(bus->devfreq)) {
|
||||
dev_err(dev, "failed to add devfreq device\n");
|
||||
- ret = PTR_ERR(bus->devfreq);
|
||||
- goto err;
|
||||
+ return PTR_ERR(bus->devfreq);
|
||||
}
|
||||
|
||||
/* Register opp_notifier to catch the change of OPP */
|
||||
ret = devm_devfreq_register_opp_notifier(dev, bus->devfreq);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to register opp notifier\n");
|
||||
- goto err;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -380,33 +330,44 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
ret = exynos_bus_enable_edev(bus);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to enable devfreq-event devices\n");
|
||||
- goto err;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
ret = exynos_bus_set_event(bus);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to set event to devfreq-event devices\n");
|
||||
- goto err;
|
||||
+ goto err_edev;
|
||||
}
|
||||
|
||||
- goto out;
|
||||
-passive:
|
||||
+ return 0;
|
||||
+
|
||||
+err_edev:
|
||||
+ if (exynos_bus_disable_edev(bus))
|
||||
+ dev_warn(dev, "failed to disable the devfreq-event devices\n");
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int exynos_bus_profile_init_passive(struct exynos_bus *bus,
|
||||
+ struct devfreq_dev_profile *profile)
|
||||
+{
|
||||
+ struct device *dev = bus->dev;
|
||||
+ struct devfreq_passive_data *passive_data;
|
||||
+ struct devfreq *parent_devfreq;
|
||||
+
|
||||
/* Initialize the struct profile and governor data for passive device */
|
||||
profile->target = exynos_bus_target;
|
||||
profile->exit = exynos_bus_passive_exit;
|
||||
|
||||
/* Get the instance of parent devfreq device */
|
||||
parent_devfreq = devfreq_get_devfreq_by_phandle(dev, 0);
|
||||
- if (IS_ERR(parent_devfreq)) {
|
||||
- ret = -EPROBE_DEFER;
|
||||
- goto err;
|
||||
- }
|
||||
+ if (IS_ERR(parent_devfreq))
|
||||
+ return -EPROBE_DEFER;
|
||||
|
||||
passive_data = devm_kzalloc(dev, sizeof(*passive_data), GFP_KERNEL);
|
||||
- if (!passive_data) {
|
||||
- ret = -ENOMEM;
|
||||
- goto err;
|
||||
- }
|
||||
+ if (!passive_data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
passive_data->parent = parent_devfreq;
|
||||
|
||||
/* Add devfreq device for exynos bus with passive governor */
|
||||
@@ -415,11 +376,61 @@ static int exynos_bus_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(bus->devfreq)) {
|
||||
dev_err(dev,
|
||||
"failed to add devfreq dev with passive governor\n");
|
||||
- ret = PTR_ERR(bus->devfreq);
|
||||
- goto err;
|
||||
+ return PTR_ERR(bus->devfreq);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int exynos_bus_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct device_node *np = dev->of_node, *node;
|
||||
+ struct devfreq_dev_profile *profile;
|
||||
+ struct exynos_bus *bus;
|
||||
+ int ret, max_state;
|
||||
+ unsigned long min_freq, max_freq;
|
||||
+ bool passive = false;
|
||||
+
|
||||
+ if (!np) {
|
||||
+ dev_err(dev, "failed to find devicetree node\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL);
|
||||
+ if (!bus)
|
||||
+ return -ENOMEM;
|
||||
+ mutex_init(&bus->lock);
|
||||
+ bus->dev = &pdev->dev;
|
||||
+ platform_set_drvdata(pdev, bus);
|
||||
+
|
||||
+ profile = devm_kzalloc(dev, sizeof(*profile), GFP_KERNEL);
|
||||
+ if (!profile)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ node = of_parse_phandle(dev->of_node, "devfreq", 0);
|
||||
+ if (node) {
|
||||
+ of_node_put(node);
|
||||
+ passive = true;
|
||||
+ } else {
|
||||
+ ret = exynos_bus_parent_parse_of(np, bus);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
-out:
|
||||
+ /* Parse the device-tree to get the resource information */
|
||||
+ ret = exynos_bus_parse_of(np, bus);
|
||||
+ if (ret < 0)
|
||||
+ goto err_reg;
|
||||
+
|
||||
+ if (passive)
|
||||
+ ret = exynos_bus_profile_init_passive(bus, profile);
|
||||
+ else
|
||||
+ ret = exynos_bus_profile_init(bus, profile);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ goto err;
|
||||
+
|
||||
max_state = bus->devfreq->profile->max_state;
|
||||
min_freq = (bus->devfreq->profile->freq_table[0] / 1000);
|
||||
max_freq = (bus->devfreq->profile->freq_table[max_state - 1] / 1000);
|
||||
2162
patch/kernel/odroidxu4-legacy/patch-4.14.165-166.patch
Normal file
2162
patch/kernel/odroidxu4-legacy/patch-4.14.165-166.patch
Normal file
File diff suppressed because it is too large
Load Diff
2219
patch/kernel/odroidxu4-legacy/patch-4.14.166-167.patch
Normal file
2219
patch/kernel/odroidxu4-legacy/patch-4.14.166-167.patch
Normal file
File diff suppressed because it is too large
Load Diff
2692
patch/kernel/rk3399-legacy/patch-4.4.210-211.patch
Normal file
2692
patch/kernel/rk3399-legacy/patch-4.4.210-211.patch
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user