mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
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.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
Reference in New Issue
Block a user