Bump Zero2 (H616) (#2907)
* Update sun50iw6.conf * Extract patches from private kernel branch, remove 5.10, cleanup Co-authored-by: Igor Pecovnik <igor.pecovnik@gmail.com>
This commit is contained in:
parent
7915b5a2e4
commit
f3dd19f890
@ -6,4 +6,4 @@ MODULES_BLACKLIST="lima"
|
||||
DEFAULT_CONSOLE="serial"
|
||||
BUILD_DESKTOP="no"
|
||||
SERIALCON="ttyS0"
|
||||
KERNEL_TARGET="current,edge"
|
||||
KERNEL_TARGET="edge"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 5.12.8 Kernel Configuration
|
||||
# Linux/arm64 5.12.12 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
@ -2067,7 +2067,12 @@ CONFIG_BLK_DEV_RBD=m
|
||||
#
|
||||
# NVME Support
|
||||
#
|
||||
CONFIG_NVME_CORE=m
|
||||
# CONFIG_NVME_MULTIPATH is not set
|
||||
# CONFIG_NVME_HWMON is not set
|
||||
CONFIG_NVME_FABRICS=m
|
||||
# CONFIG_NVME_FC is not set
|
||||
CONFIG_NVME_TCP=m
|
||||
# CONFIG_NVME_TARGET is not set
|
||||
# end of NVME Support
|
||||
|
||||
|
||||
@ -8,14 +8,10 @@ ASOUND_STATE='asound.state.sun50iw2-dev'
|
||||
|
||||
if [[ $BOARD == orangepizero2 ]]; then
|
||||
|
||||
ATFSOURCE='https://github.com/apritzel/arm-trusted-firmware'
|
||||
ATFBRANCH='branch:h616-beta'
|
||||
|
||||
ATF_PLAT="sun50i_h616";
|
||||
ATF_TARGET_MAP='PLAT=sun50i_h616 DEBUG=1 bl31;;build/sun50i_h616/debug/bl31.bin'
|
||||
|
||||
BOOTSOURCE='https://github.com/jernejsk/u-boot'
|
||||
BOOTBRANCH='branch:h616-v2'
|
||||
BOOTBRANCH='branch:master'
|
||||
|
||||
[[ -z $CPUMAX ]] && CPUMAX=1512000
|
||||
|
||||
|
||||
@ -555,8 +555,8 @@ orangepizero edge hirsute cli stable
|
||||
|
||||
|
||||
# orangepizero2
|
||||
orangepizero2 current buster cli stable yes
|
||||
orangepizero2 current focal cli stable yes
|
||||
orangepizero2 edge buster cli stable yes
|
||||
orangepizero2 edge focal cli stable yes
|
||||
orangepizero2 edge hirsute cli stable yes
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
From 3a19442450cc2a248b6591f538527b4abb19065f Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Thu, 21 Jan 2021 17:01:44 +0000
|
||||
Subject: [PATCH 01/23] dt-bindings: mfd: axp20x: Add AXP305 compatible (plus
|
||||
optional IRQ)
|
||||
|
||||
The AXP305 PMIC used on many boards with the H616 SoC seems to be fully
|
||||
compatible to the AXP805 PMIC, so add the proper chain of compatible
|
||||
strings.
|
||||
|
||||
Also at least on one board (Orangepi Zero2) there is no interrupt line
|
||||
connected to the CPU, so make the "interrupts" property optional.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/mfd/axp20x.txt | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/mfd/axp20x.txt b/Documentation/devicetree/bindings/mfd/axp20x.txt
|
||||
index 4991a6415796..2b53dcc0ea61 100644
|
||||
--- a/Documentation/devicetree/bindings/mfd/axp20x.txt
|
||||
+++ b/Documentation/devicetree/bindings/mfd/axp20x.txt
|
||||
@@ -26,10 +26,10 @@ Required properties:
|
||||
* "x-powers,axp803"
|
||||
* "x-powers,axp806"
|
||||
* "x-powers,axp805", "x-powers,axp806"
|
||||
+ * "x-powers,axp305", "x-powers,axp805", "x-powers,axp806"
|
||||
* "x-powers,axp809"
|
||||
* "x-powers,axp813"
|
||||
- reg: The I2C slave address or RSB hardware address for the AXP chip
|
||||
-- interrupts: SoC NMI / GPIO interrupt connected to the PMIC's IRQ pin
|
||||
- interrupt-controller: The PMIC has its own internal IRQs
|
||||
- #interrupt-cells: Should be set to 1
|
||||
|
||||
@@ -43,6 +43,7 @@ more information:
|
||||
AXP20x/LDO3: software-based implementation
|
||||
|
||||
Optional properties:
|
||||
+- interrupts: SoC NMI / GPIO interrupt connected to the PMIC's IRQ pin
|
||||
- x-powers,dcdc-freq: defines the work frequency of DC-DC in KHz
|
||||
AXP152/20X: range: 750-1875, Default: 1.5 MHz
|
||||
AXP22X/8XX: range: 1800-4050, Default: 3 MHz
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,70 @@
|
||||
From 106e37f49174a6269bcd4869105e1c23b1a01b14 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Mon, 7 Dec 2020 12:30:21 +0000
|
||||
Subject: [PATCH 02/23] mfd: axp20x: Allow AXP 806 chips without interrupt
|
||||
lines
|
||||
|
||||
Currently the AXP chip requires to have its IRQ line connected to some
|
||||
interrupt controller, and will fail probing when this is not the case.
|
||||
|
||||
On a new Allwinner SoC (H616) there is no NMI pin anymore, and at
|
||||
least one board does not connect the AXP's IRQ pin to anything else,
|
||||
so the interrupt functionality of the AXP chip is simply not available.
|
||||
|
||||
Check whether the interrupt line number returned by the platform code is
|
||||
valid, before trying to register the irqchip. If not, we skip this
|
||||
registration, to avoid the driver to bail out completely.
|
||||
Also we need to skip the power key functionality, as this relies on
|
||||
a valid IRQ as well.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/mfd/axp20x.c | 24 +++++++++++++++++-------
|
||||
1 file changed, 17 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
|
||||
index 3eae04e24ac8..4145a38b3890 100644
|
||||
--- a/drivers/mfd/axp20x.c
|
||||
+++ b/drivers/mfd/axp20x.c
|
||||
@@ -884,8 +884,13 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
|
||||
axp20x->regmap_irq_chip = &axp803_regmap_irq_chip;
|
||||
break;
|
||||
case AXP806_ID:
|
||||
+ /*
|
||||
+ * Don't register the power key part if in slave mode or
|
||||
+ * if there is no interrupt line.
|
||||
+ */
|
||||
if (of_property_read_bool(axp20x->dev->of_node,
|
||||
- "x-powers,self-working-mode")) {
|
||||
+ "x-powers,self-working-mode") &&
|
||||
+ axp20x->irq > 0) {
|
||||
axp20x->nr_cells = ARRAY_SIZE(axp806_self_working_cells);
|
||||
axp20x->cells = axp806_self_working_cells;
|
||||
} else {
|
||||
@@ -959,12 +964,17 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
|
||||
AXP806_REG_ADDR_EXT_ADDR_SLAVE_MODE);
|
||||
}
|
||||
|
||||
- ret = regmap_add_irq_chip(axp20x->regmap, axp20x->irq,
|
||||
- IRQF_ONESHOT | IRQF_SHARED | axp20x->irq_flags,
|
||||
- -1, axp20x->regmap_irq_chip, &axp20x->regmap_irqc);
|
||||
- if (ret) {
|
||||
- dev_err(axp20x->dev, "failed to add irq chip: %d\n", ret);
|
||||
- return ret;
|
||||
+ /* Only if there is an interrupt line connected towards the CPU. */
|
||||
+ if (axp20x->irq > 0) {
|
||||
+ ret = regmap_add_irq_chip(axp20x->regmap, axp20x->irq,
|
||||
+ IRQF_ONESHOT | IRQF_SHARED | axp20x->irq_flags,
|
||||
+ -1, axp20x->regmap_irq_chip,
|
||||
+ &axp20x->regmap_irqc);
|
||||
+ if (ret) {
|
||||
+ dev_err(axp20x->dev, "failed to add irq chip: %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
}
|
||||
|
||||
ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells,
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -1,9 +1,31 @@
|
||||
From d0a7d8cdefba02230e0fb1f97cb0c1210e7a077a Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Fri, 27 Nov 2020 15:28:12 +0000
|
||||
Subject: [PATCH 03/23] arm64: dts: allwinner: Add Allwinner H616 .dtsi file
|
||||
|
||||
This (relatively) new SoC is similar to the H6, but drops the (broken)
|
||||
PCIe support and the USB 3.0 controller. It also gets the management
|
||||
controller removed, which in turn removes *some*, but not all of the
|
||||
devices formerly dedicated to the ARISC (CPUS).
|
||||
And while there is still the extra sunxi interrupt controller, the
|
||||
package lacks the corresponding NMI pin, so no interrupts for the PMIC.
|
||||
|
||||
The reserved memory node is actually handled by Trusted Firmware now,
|
||||
but U-Boot fails to propagate this to a separately loaded DTB, so we
|
||||
keep it in here for now, until U-Boot learns to do this properly.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
.../arm64/boot/dts/allwinner/sun50i-h616.dtsi | 570 ++++++++++++++++++
|
||||
1 file changed, 570 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..dcffbfdcd26b
|
||||
index 000000000000..0ad0c25b4c83
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
@@ -0,0 +1,704 @@
|
||||
@@ -0,0 +1,570 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+// Copyright (C) 2020 Arm Ltd.
|
||||
+// based on the H6 dtsi, which is:
|
||||
@ -69,13 +91,20 @@ index 000000000000..dcffbfdcd26b
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ osc24M: osc24M_clk {
|
||||
+ osc24M: osc24M-clk {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <24000000>;
|
||||
+ clock-output-names = "osc24M";
|
||||
+ };
|
||||
+
|
||||
+ osc32k_int: osc32k-int {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <32768>;
|
||||
+ clock-output-names = "osc32k-int";
|
||||
+ };
|
||||
+
|
||||
+ pmu {
|
||||
+ compatible = "arm,cortex-a53-pmu";
|
||||
+ interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
|
||||
@ -110,8 +139,7 @@ index 000000000000..dcffbfdcd26b
|
||||
+ ranges = <0x0 0x0 0x0 0x40000000>;
|
||||
+
|
||||
+ syscon: syscon@3000000 {
|
||||
+ compatible = "allwinner,sun50i-h616-system-control",
|
||||
+ "allwinner,sun50i-a64-system-control";
|
||||
+ compatible = "allwinner,sun50i-h616-system-control";
|
||||
+ reg = <0x03000000 0x1000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
@ -124,26 +152,12 @@ index 000000000000..dcffbfdcd26b
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0 0x00028000 0x30000>;
|
||||
+ };
|
||||
+
|
||||
+ sram_c1: sram@1a00000 {
|
||||
+ compatible = "mmio-sram";
|
||||
+ reg = <0x01a00000 0x200000>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0 0x01a00000 0x200000>;
|
||||
+
|
||||
+ ve_sram: sram-section@0 {
|
||||
+ compatible = "allwinner,sun50i-h616-sram-c1",
|
||||
+ "allwinner,sun4i-a10-sram-c1";
|
||||
+ reg = <0x000000 0x200000>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ ccu: clock@3001000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ccu";
|
||||
+ reg = <0x03001000 0x1000>;
|
||||
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>;
|
||||
+ clocks = <&osc24M>, <&osc32k_int>, <&osc32k_int>;
|
||||
+ clock-names = "hosc", "losc", "iosc";
|
||||
+ #clock-cells = <1>;
|
||||
+ #reset-cells = <1>;
|
||||
@ -155,18 +169,21 @@ index 000000000000..dcffbfdcd26b
|
||||
+ reg = <0x030090a0 0x20>;
|
||||
+ interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&osc24M>;
|
||||
+ status = "disabled";
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+
|
||||
+ pio: pinctrl@300b000 {
|
||||
+ compatible = "allwinner,sun50i-h616-pinctrl";
|
||||
+ reg = <0x0300b000 0x400>;
|
||||
+ interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_APB1>, <&osc24M>, <&rtc 0>;
|
||||
+ clocks = <&ccu CLK_APB1>, <&osc24M>, <&osc32k_int>;
|
||||
+ clock-names = "apb", "hosc", "losc";
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <3>;
|
||||
@ -187,12 +204,12 @@ index 000000000000..dcffbfdcd26b
|
||||
+ function = "i2c0";
|
||||
+ };
|
||||
+
|
||||
+ i2c3_pins_a: i2c1-pins-a {
|
||||
+ i2c3_ph_pins: i2c3-ph-pins {
|
||||
+ pins = "PH4", "PH5";
|
||||
+ function = "i2c3";
|
||||
+ };
|
||||
+
|
||||
+ ir_rx_pin: ir_rx_pin {
|
||||
+ ir_rx_pin: ir-rx-pin {
|
||||
+ pins = "PH10";
|
||||
+ function = "ir_rx";
|
||||
+ };
|
||||
@ -276,6 +293,11 @@ index 000000000000..dcffbfdcd26b
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc0_pins>;
|
||||
+ status = "disabled";
|
||||
+ max-frequency = <150000000>;
|
||||
+ cap-sd-highspeed;
|
||||
+ cap-mmc-highspeed;
|
||||
+ mmc-ddr-3_3v;
|
||||
+ cap-sdio-irq;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
@ -292,13 +314,18 @@ index 000000000000..dcffbfdcd26b
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc1_pins>;
|
||||
+ status = "disabled";
|
||||
+ max-frequency = <150000000>;
|
||||
+ cap-sd-highspeed;
|
||||
+ cap-mmc-highspeed;
|
||||
+ mmc-ddr-3_3v;
|
||||
+ cap-sdio-irq;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ mmc2: mmc@4022000 {
|
||||
+ compatible = "allwinner,sun50i-h616-emmc",
|
||||
+ "allwinner,sun50i-a64-emmc";
|
||||
+ "allwinner,sun50i-a100-emmc";
|
||||
+ reg = <0x04022000 0x1000>;
|
||||
+ clocks = <&ccu CLK_BUS_MMC2>, <&ccu CLK_MMC2>;
|
||||
+ clock-names = "ahb", "mmc";
|
||||
@ -308,6 +335,11 @@ index 000000000000..dcffbfdcd26b
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc2_pins>;
|
||||
+ status = "disabled";
|
||||
+ max-frequency = <150000000>;
|
||||
+ cap-sd-highspeed;
|
||||
+ cap-mmc-highspeed;
|
||||
+ mmc-ddr-3_3v;
|
||||
+ cap-sdio-irq;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
@ -483,181 +515,17 @@ index 000000000000..dcffbfdcd26b
|
||||
+ clock-names = "stmmaceth";
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ mdio: mdio {
|
||||
+ mdio0: mdio {
|
||||
+ compatible = "snps,dwmac-mdio";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ usbotg: usb@5100000 {
|
||||
+ compatible = "allwinner,sun50i-h616-musb",
|
||||
+ "allwinner,sun8i-a33-musb";
|
||||
+ reg = <0x05100000 0x0400>;
|
||||
+ clocks = <&ccu CLK_BUS_OTG>;
|
||||
+ resets = <&ccu RST_BUS_OTG>;
|
||||
+ interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "mc";
|
||||
+ phys = <&usbphy 0>;
|
||||
+ phy-names = "usb";
|
||||
+ extcon = <&usbphy 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ usbphy: phy@5100400 {
|
||||
+ compatible = "allwinner,sun50i-h616-usb-phy";
|
||||
+ reg = <0x05100400 0x24>,
|
||||
+ <0x05101800 0x4>,
|
||||
+ <0x05200800 0x4>,
|
||||
+ <0x05310800 0x4>,
|
||||
+ <0x05311800 0x4>;
|
||||
+ reg-names = "phy_ctrl",
|
||||
+ "pmu0",
|
||||
+ "pmu1",
|
||||
+ "pmu2",
|
||||
+ "pmu3";
|
||||
+ clocks = <&ccu CLK_USB_PHY0>,
|
||||
+ <&ccu CLK_USB_PHY1>,
|
||||
+ <&ccu CLK_USB_PHY2>,
|
||||
+ <&ccu CLK_USB_PHY3>;
|
||||
+ clock-names = "usb0_phy",
|
||||
+ "usb1_phy",
|
||||
+ "usb2_phy",
|
||||
+ "usb3_phy";
|
||||
+ resets = <&ccu RST_USB_PHY0>,
|
||||
+ <&ccu RST_USB_PHY1>,
|
||||
+ <&ccu RST_USB_PHY2>,
|
||||
+ <&ccu RST_USB_PHY3>;
|
||||
+ reset-names = "usb0_reset",
|
||||
+ "usb1_reset",
|
||||
+ "usb2_reset",
|
||||
+ "usb3_reset";
|
||||
+ status = "disabled";
|
||||
+ #phy-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ ehci0: usb@5101000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05101000 0x100>;
|
||||
+ interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI0>,
|
||||
+ <&ccu CLK_BUS_EHCI0>,
|
||||
+ <&ccu CLK_USB_OHCI0>;
|
||||
+ resets = <&ccu RST_BUS_OHCI0>,
|
||||
+ <&ccu RST_BUS_EHCI0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci0: usb@5101400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05101400 0x100>;
|
||||
+ interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI0>,
|
||||
+ <&ccu CLK_USB_OHCI0>;
|
||||
+ resets = <&ccu RST_BUS_OHCI0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ehci1: usb@5200000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05200000 0x100>;
|
||||
+ interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI1>,
|
||||
+ <&ccu CLK_BUS_EHCI1>,
|
||||
+ <&ccu CLK_USB_OHCI1>;
|
||||
+ resets = <&ccu RST_BUS_OHCI1>,
|
||||
+ <&ccu RST_BUS_EHCI1>;
|
||||
+ phys = <&usbphy 1>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci1: usb@5200400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05200400 0x100>;
|
||||
+ interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI1>,
|
||||
+ <&ccu CLK_USB_OHCI1>;
|
||||
+ resets = <&ccu RST_BUS_OHCI1>;
|
||||
+ phys = <&usbphy 1>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ehci2: usb@5310000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05310000 0x100>;
|
||||
+ interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI2>,
|
||||
+ <&ccu CLK_BUS_EHCI2>,
|
||||
+ <&ccu CLK_USB_OHCI2>;
|
||||
+ resets = <&ccu RST_BUS_OHCI2>,
|
||||
+ <&ccu RST_BUS_EHCI2>;
|
||||
+ phys = <&usbphy 2>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci2: usb@5310400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05310400 0x100>;
|
||||
+ interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI2>,
|
||||
+ <&ccu CLK_USB_OHCI2>;
|
||||
+ resets = <&ccu RST_BUS_OHCI2>;
|
||||
+ phys = <&usbphy 2>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ehci3: usb@5311000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05311000 0x100>;
|
||||
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI3>,
|
||||
+ <&ccu CLK_BUS_EHCI3>,
|
||||
+ <&ccu CLK_USB_OHCI3>;
|
||||
+ resets = <&ccu RST_BUS_OHCI3>,
|
||||
+ <&ccu RST_BUS_EHCI3>;
|
||||
+ phys = <&usbphy 3>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci3: usb@5311400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05311400 0x100>;
|
||||
+ interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI3>,
|
||||
+ <&ccu CLK_USB_OHCI3>;
|
||||
+ resets = <&ccu RST_BUS_OHCI3>;
|
||||
+ phys = <&usbphy 3>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ rtc: rtc@7000000 {
|
||||
+ compatible = "allwinner,sun50i-h616-rtc",
|
||||
+ "allwinner,sun50i-h6-rtc";
|
||||
+ reg = <0x07000000 0x400>;
|
||||
+ interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clock-output-names = "osc32k", "osc32k-out", "iosc";
|
||||
+ #clock-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ r_ccu: clock@7010000 {
|
||||
+ compatible = "allwinner,sun50i-h616-r-ccu";
|
||||
+ reg = <0x07010000 0x400>;
|
||||
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
|
||||
+ reg = <0x07010000 0x210>;
|
||||
+ clocks = <&osc24M>, <&osc32k_int>, <&osc32k_int>,
|
||||
+ <&ccu CLK_PLL_PERIPH0>;
|
||||
+ clock-names = "hosc", "losc", "iosc", "pll-periph";
|
||||
+ #clock-cells = <1>;
|
||||
@ -668,7 +536,7 @@ index 000000000000..dcffbfdcd26b
|
||||
+ compatible = "allwinner,sun50i-h616-r-pinctrl";
|
||||
+ reg = <0x07022000 0x400>;
|
||||
+ interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&r_ccu CLK_R_APB1>, <&osc24M>, <&rtc 0>;
|
||||
+ clocks = <&r_ccu CLK_R_APB1>, <&osc24M>, <&osc32k_int>;
|
||||
+ clock-names = "apb", "hosc", "losc";
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <3>;
|
||||
@ -679,6 +547,11 @@ index 000000000000..dcffbfdcd26b
|
||||
+ pins = "PL0", "PL1";
|
||||
+ function = "s_i2c";
|
||||
+ };
|
||||
+
|
||||
+ r_rsb_pins: r-rsb-pins {
|
||||
+ pins = "PL0", "PL1";
|
||||
+ function = "s_rsb";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ ir: ir@7040000 {
|
||||
@ -686,10 +559,10 @@ index 000000000000..dcffbfdcd26b
|
||||
+ "allwinner,sun6i-a31-ir";
|
||||
+ reg = <0x07040000 0x400>;
|
||||
+ interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_R_APB1_IR>,
|
||||
+ <&ccu CLK_IR>;
|
||||
+ clocks = <&r_ccu CLK_R_APB1_IR>,
|
||||
+ <&r_ccu CLK_IR>;
|
||||
+ clock-names = "apb", "ir";
|
||||
+ resets = <&ccu RST_R_APB1_IR>;
|
||||
+ resets = <&r_ccu RST_R_APB1_IR>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&ir_rx_pin>;
|
||||
+ status = "disabled";
|
||||
@ -706,5 +579,23 @@ index 000000000000..dcffbfdcd26b
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ r_rsb: rsb@7083000 {
|
||||
+ compatible = "allwinner,sun50i-h616-rsb",
|
||||
+ "allwinner,sun8i-a23-rsb";
|
||||
+ reg = <0x07083000 0x400>;
|
||||
+ interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&r_ccu CLK_R_APB2_RSB>;
|
||||
+ clock-frequency = <3000000>;
|
||||
+ resets = <&r_ccu RST_R_APB2_RSB>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&r_rsb_pins>;
|
||||
+ status = "disabled";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
From 9c292a40cfeaa1adedc893c468d4a772619e9b9f Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Mon, 7 Dec 2020 21:35:46 +0000
|
||||
Subject: [PATCH 04/23] dt-bindings: arm: sunxi: Add two H616 board compatible
|
||||
strings
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/sunxi.yaml | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/sunxi.yaml b/Documentation/devicetree/bindings/arm/sunxi.yaml
|
||||
index ac750025a2eb..0b20d2260d0b 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/sunxi.yaml
|
||||
+++ b/Documentation/devicetree/bindings/arm/sunxi.yaml
|
||||
@@ -837,6 +837,11 @@ properties:
|
||||
- const: yones-toptech,bs1078-v2
|
||||
- const: allwinner,sun6i-a31s
|
||||
|
||||
+ - description: X96 Mate TV box
|
||||
+ items:
|
||||
+ - const: hechuang,x96-mate
|
||||
+ - const: allwinner,sun50i-h616
|
||||
+
|
||||
- description: Xunlong OrangePi
|
||||
items:
|
||||
- const: xunlong,orangepi
|
||||
@@ -937,4 +942,9 @@ properties:
|
||||
- const: xunlong,orangepi-zero-plus2-h3
|
||||
- const: allwinner,sun8i-h3
|
||||
|
||||
+ - description: Xunlong OrangePi Zero 2
|
||||
+ items:
|
||||
+ - const: xunlong,orangepi-zero2
|
||||
+ - const: allwinner,sun50i-h616
|
||||
+
|
||||
additionalProperties: true
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -1,21 +1,51 @@
|
||||
From 9aa444ccb4c21267dc5d6ddb576342cc63f5d06c Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Fri, 27 Nov 2020 15:28:40 +0000
|
||||
Subject: [PATCH 05/23] arm64: dts: allwinner: h616: Add OrangePi Zero 2 board
|
||||
support
|
||||
|
||||
The OrangePi Zero 2 is a development board with the new H616 SoC. It
|
||||
comes with the following features:
|
||||
- Four ARM Cortex-A53 cores, Mali-G31 MP2 GPU
|
||||
- 512MiB/1GiB DDR3 DRAM
|
||||
- AXP305 PMIC
|
||||
- Raspberry-Pi-1 compatible GPIO header
|
||||
- extra 13 pin expansion header, exposing pins for 2x USB 2.0 ports
|
||||
- 1 USB 2.0 host port
|
||||
- 1 USB 2.0 type C port (power supply + OTG)
|
||||
- MicroSD slot
|
||||
- on-board 2MiB bootable SPI NOR flash
|
||||
- 1Gbps Ethernet port (via RTL8211F PHY)
|
||||
- micro-HDMI port
|
||||
- unsupported Allwinner WiFi/BT chip
|
||||
|
||||
For more details see: https://linux-sunxi.org/Orange_Pi_Zero_2
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/Makefile | 1 +
|
||||
.../allwinner/sun50i-h616-orangepi-zero2.dts | 203 ++++++++++++++++++
|
||||
2 files changed, 204 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
index 211d1e9d4701..0cf8299b1ce7 100644
|
||||
index 41ce680e5f8d..9ba4b5d92657 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
@@ -35,6 +35,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-one-plus.dtb
|
||||
@@ -38,6 +38,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-m1-plus2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-prime.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-beelink-gs1.dtb
|
||||
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h616-orangepi-zero2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-beelink-gs1.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-lite2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-one-plus.dtb
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts b/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
|
||||
new file mode 100644
|
||||
index 000000000000..814f5b4fec7c
|
||||
index 000000000000..ca07cae698ce
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
|
||||
@@ -0,0 +1,228 @@
|
||||
@@ -0,0 +1,203 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||
+/*
|
||||
+ * Copyright (C) 2020 Arm Ltd.
|
||||
@ -27,6 +57,7 @@ index 000000000000..814f5b4fec7c
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+#include <dt-bindings/leds/common.h>
|
||||
+
|
||||
+/ {
|
||||
+ model = "OrangePi Zero2";
|
||||
@ -44,15 +75,17 @@ index 000000000000..814f5b4fec7c
|
||||
+ leds {
|
||||
+ compatible = "gpio-leds";
|
||||
+
|
||||
+ power {
|
||||
+ label = "orangepi:red:power";
|
||||
+ gpios = <&pio 2 13 GPIO_ACTIVE_HIGH>; /* PC13 */
|
||||
+ led-0 {
|
||||
+ function = LED_FUNCTION_POWER;
|
||||
+ color = <LED_COLOR_ID_RED>;
|
||||
+ gpios = <&pio 2 12 GPIO_ACTIVE_HIGH>; /* PC12 */
|
||||
+ default-state = "on";
|
||||
+ };
|
||||
+
|
||||
+ status {
|
||||
+ label = "orangepi:green:status";
|
||||
+ gpios = <&pio 2 12 GPIO_ACTIVE_HIGH>; /* PC12 */
|
||||
+ led-1 {
|
||||
+ function = LED_FUNCTION_STATUS;
|
||||
+ color = <LED_COLOR_ID_GREEN>;
|
||||
+ gpios = <&pio 2 13 GPIO_ACTIVE_HIGH>; /* PC13 */
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
@ -64,32 +97,12 @@ index 000000000000..814f5b4fec7c
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ reg_usb1_vbus: usb1-vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "usb1-vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ enable-active-high;
|
||||
+ gpio = <&pio 2 16 GPIO_ACTIVE_HIGH>; /* PC16 */
|
||||
+ status = "okay";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ehci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ehci1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+/* USB 2 & 3 are on headers only. */
|
||||
+
|
||||
+&emac0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&ext_rgmii_pins>;
|
||||
+ phy-mode = "rgmii-id";
|
||||
+ phy-mode = "rgmii";
|
||||
+ phy-handle = <&ext_rgmii_phy>;
|
||||
+ phy-supply = <®_dcdce>;
|
||||
+ allwinner,rx-delay-ps = <3100>;
|
||||
@ -97,7 +110,7 @@ index 000000000000..814f5b4fec7c
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mdio {
|
||||
+&mdio0 {
|
||||
+ ext_rgmii_phy: ethernet-phy@1 {
|
||||
+ compatible = "ethernet-phy-ieee802.3-c22";
|
||||
+ reg = <1>;
|
||||
@ -111,26 +124,15 @@ index 000000000000..814f5b4fec7c
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&r_i2c {
|
||||
+&r_rsb {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ axp305: pmic@36 {
|
||||
+ axp305: pmic@745 {
|
||||
+ compatible = "x-powers,axp305", "x-powers,axp805",
|
||||
+ "x-powers,axp806";
|
||||
+ reg = <0x36>;
|
||||
+
|
||||
+ /* dummy interrupt to appease the driver for now */
|
||||
+ interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ reg = <0x745>;
|
||||
+
|
||||
+ x-powers,self-working-mode;
|
||||
+ vina-supply = <®_vcc5v>;
|
||||
@ -150,13 +152,15 @@ index 000000000000..814f5b4fec7c
|
||||
+ regulator-name = "vcc-sys";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo2: aldo2 {
|
||||
+ reg_aldo2: aldo2 { /* 3.3V on headers */
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc3v3-ext";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo3: aldo3 {
|
||||
+ reg_aldo3: aldo3 { /* 3.3V on headers */
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc3v3-ext2";
|
||||
@ -228,19 +232,23 @@ index 000000000000..814f5b4fec7c
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&spi0 {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ flash@0 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ compatible = "jedec,spi-nor";
|
||||
+ reg = <0>;
|
||||
+ spi-max-frequency = <40000000>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart0_ph_pins>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbotg {
|
||||
+ dr_mode = "otg";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbphy {
|
||||
+ usb0_vbus-supply = <®_vcc5v>;
|
||||
+ usb1_vbus-supply = <®_usb1_vbus>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,230 @@
|
||||
From 73a6a2c5310654b57207ed9a6ad6e9c1e7b3515f Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 28 Apr 2021 00:06:26 +0100
|
||||
Subject: [PATCH 06/23] arm64: dts: allwinner: h616: Add X96 Mate TV box
|
||||
support
|
||||
|
||||
The X96 Mate is an Allwinner H616 based TV box, featuring:
|
||||
- Four ARM Cortex-A53 cores, Mali-G31 MP2 GPU
|
||||
- 2GiB/4GiB RAM (fully usable!)
|
||||
- 16/32/64GiB eMMC
|
||||
- 100Mbps Ethernet (via embedded AC200 EPHY, not yet supported)
|
||||
- Unsupported Allwinner WiFi chip
|
||||
- 2 x USB 2.0 host ports
|
||||
- HDMI port
|
||||
- IR receiver
|
||||
- 5V/2A DC power supply via barrel plug
|
||||
|
||||
For more information see: https://linux-sunxi.org/X96_Mate
|
||||
|
||||
Add a basic devicetree for it, with SD card and eMMC working, as
|
||||
well as serial and the essential peripherals, like the AXP PMIC.
|
||||
|
||||
This DT is somewhat minimal, and should work on many other similar TV
|
||||
boxes with the Allwinner H616 chip.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/Makefile | 1 +
|
||||
.../dts/allwinner/sun50i-h616-x96-mate.dts | 177 ++++++++++++++++++
|
||||
2 files changed, 178 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
index 9ba4b5d92657..370d24ebaacf 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
@@ -38,6 +38,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-m1-plus2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus2.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h616-orangepi-zero2.dtb
|
||||
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h616-x96-mate.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-beelink-gs1.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-lite2.dtb
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts b/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts
|
||||
new file mode 100644
|
||||
index 000000000000..aedb3a3dff38
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts
|
||||
@@ -0,0 +1,177 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||
+/*
|
||||
+ * Copyright (C) 2021 Arm Ltd.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "sun50i-h616.dtsi"
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+
|
||||
+/ {
|
||||
+ model = "X96 Mate";
|
||||
+ compatible = "hechuang,x96-mate", "allwinner,sun50i-h616";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+
|
||||
+ reg_vcc5v: vcc5v {
|
||||
+ /* board wide 5V supply directly from the DC input */
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc-5v";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ir {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mmc0 {
|
||||
+ vmmc-supply = <®_dcdce>;
|
||||
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
|
||||
+ bus-width = <4>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mmc2 {
|
||||
+ vmmc-supply = <®_dcdce>;
|
||||
+ vqmmc-supply = <®_bldo1>;
|
||||
+ bus-width = <8>;
|
||||
+ non-removable;
|
||||
+ cap-mmc-hw-reset;
|
||||
+ mmc-ddr-1_8v;
|
||||
+ mmc-hs200-1_8v;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&r_rsb {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ axp305: pmic@745 {
|
||||
+ compatible = "x-powers,axp305", "x-powers,axp805",
|
||||
+ "x-powers,axp806";
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ reg = <0x745>;
|
||||
+
|
||||
+ x-powers,self-working-mode;
|
||||
+ vina-supply = <®_vcc5v>;
|
||||
+ vinb-supply = <®_vcc5v>;
|
||||
+ vinc-supply = <®_vcc5v>;
|
||||
+ vind-supply = <®_vcc5v>;
|
||||
+ vine-supply = <®_vcc5v>;
|
||||
+ aldoin-supply = <®_vcc5v>;
|
||||
+ bldoin-supply = <®_vcc5v>;
|
||||
+ cldoin-supply = <®_vcc5v>;
|
||||
+
|
||||
+ regulators {
|
||||
+ reg_aldo1: aldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-sys";
|
||||
+ };
|
||||
+
|
||||
+ /* Enabled by the Android BSP */
|
||||
+ reg_aldo2: aldo2 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc3v3-ext";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ /* Enabled by the Android BSP */
|
||||
+ reg_aldo3: aldo3 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc3v3-ext2";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ reg_bldo1: bldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc1v8";
|
||||
+ };
|
||||
+
|
||||
+ /* Enabled by the Android BSP */
|
||||
+ reg_bldo2: bldo2 {
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc1v8-2";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ bldo3 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ bldo4 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ cldo1 {
|
||||
+ regulator-min-microvolt = <2500000>;
|
||||
+ regulator-max-microvolt = <2500000>;
|
||||
+ regulator-name = "vcc2v5";
|
||||
+ };
|
||||
+
|
||||
+ cldo2 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ cldo3 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdca: dcdca {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <810000>;
|
||||
+ regulator-max-microvolt = <1080000>;
|
||||
+ regulator-name = "vdd-cpu";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdcc: dcdcc {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <810000>;
|
||||
+ regulator-max-microvolt = <1080000>;
|
||||
+ regulator-name = "vdd-gpu-sys";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdcd: dcdcd {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1360000>;
|
||||
+ regulator-max-microvolt = <1360000>;
|
||||
+ regulator-name = "vdd-dram";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdce: dcdce {
|
||||
+ regulator-boot-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-eth-mmc";
|
||||
+ };
|
||||
+
|
||||
+ sw {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart0_ph_pins>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
From 075bdd9f53190b9b9a41e24188c4d7d18af5607b Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Tue, 8 Dec 2020 01:22:29 +0000
|
||||
Subject: [PATCH 07/23] dt-bindings: usb: sunxi-musb: Add H616 compatible
|
||||
string
|
||||
|
||||
The H616 MUSB peripheral is compatible to the H3 one (8 endpoints).
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
.../devicetree/bindings/usb/allwinner,sun4i-a10-musb.yaml | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/usb/allwinner,sun4i-a10-musb.yaml b/Documentation/devicetree/bindings/usb/allwinner,sun4i-a10-musb.yaml
|
||||
index 0f520f17735e..933fa356d2ce 100644
|
||||
--- a/Documentation/devicetree/bindings/usb/allwinner,sun4i-a10-musb.yaml
|
||||
+++ b/Documentation/devicetree/bindings/usb/allwinner,sun4i-a10-musb.yaml
|
||||
@@ -22,6 +22,9 @@ properties:
|
||||
- allwinner,sun8i-a83t-musb
|
||||
- allwinner,sun50i-h6-musb
|
||||
- const: allwinner,sun8i-a33-musb
|
||||
+ - items:
|
||||
+ - const: allwinner,sun50i-h616-musb
|
||||
+ - const: allwinner,sun8i-h3-musb
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
From 1fb25d94dbf8218b1fb8cb2743cdc783fe1642ca Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Tue, 8 Dec 2020 00:44:17 +0000
|
||||
Subject: [PATCH 08/23] dt-bindings: usb: Add H616 compatible string
|
||||
|
||||
The H616 has four PHYs as the H3, along with their respective clock
|
||||
gates and resets, so the property description is identical.
|
||||
|
||||
However the PHYs itself need some special bits, so we need a new
|
||||
compatible string for it.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
.../devicetree/bindings/phy/allwinner,sun8i-h3-usb-phy.yaml | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/phy/allwinner,sun8i-h3-usb-phy.yaml b/Documentation/devicetree/bindings/phy/allwinner,sun8i-h3-usb-phy.yaml
|
||||
index f80431060803..e288450e0844 100644
|
||||
--- a/Documentation/devicetree/bindings/phy/allwinner,sun8i-h3-usb-phy.yaml
|
||||
+++ b/Documentation/devicetree/bindings/phy/allwinner,sun8i-h3-usb-phy.yaml
|
||||
@@ -15,7 +15,9 @@ properties:
|
||||
const: 1
|
||||
|
||||
compatible:
|
||||
- const: allwinner,sun8i-h3-usb-phy
|
||||
+ enum:
|
||||
+ - allwinner,sun8i-h3-usb-phy
|
||||
+ - allwinner,sun50i-h616-usb-phy
|
||||
|
||||
reg:
|
||||
items:
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,164 @@
|
||||
From d20b27d83d5688e1109ba5e9a649b48297aa732c Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Sun, 6 Dec 2020 01:39:24 +0000
|
||||
Subject: [PATCH 09/23] phy: sun4i-usb: Rework HCI PHY (aka. "pmu_unk1")
|
||||
handling
|
||||
|
||||
As Icenowy pointed out, newer manuals (starting with H6) actually
|
||||
document the register block at offset 0x800 as "HCI controller and PHY
|
||||
interface", also describe the bits in our "PMU_UNK1" register.
|
||||
Let's put proper names to those "unknown" variables and symbols.
|
||||
|
||||
While we are at it, generalise the existing code by allowing a bitmap
|
||||
of bits to clear and set, to cover newer SoCs: The A100 and H616 use a
|
||||
different bit for the SIDDQ control.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/phy/allwinner/phy-sun4i-usb.c | 30 ++++++++++++---------------
|
||||
1 file changed, 13 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
index 788dd5cdbb7d..142f4cafdc78 100644
|
||||
--- a/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
+++ b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
@@ -43,7 +43,7 @@
|
||||
#define REG_PHYCTL_A33 0x10
|
||||
#define REG_PHY_OTGCTL 0x20
|
||||
|
||||
-#define REG_PMU_UNK1 0x10
|
||||
+#define REG_HCI_PHY_CTL 0x10
|
||||
|
||||
#define PHYCTL_DATA BIT(7)
|
||||
|
||||
@@ -82,6 +82,7 @@
|
||||
/* A83T specific control bits for PHY0 */
|
||||
#define PHY_CTL_VBUSVLDEXT BIT(5)
|
||||
#define PHY_CTL_SIDDQ BIT(3)
|
||||
+#define PHY_CTL_H3_SIDDQ BIT(1)
|
||||
|
||||
/* A83T specific control bits for PHY2 HSIC */
|
||||
#define SUNXI_EHCI_HS_FORCE BIT(20)
|
||||
@@ -115,9 +116,9 @@ struct sun4i_usb_phy_cfg {
|
||||
int hsic_index;
|
||||
enum sun4i_usb_phy_type type;
|
||||
u32 disc_thresh;
|
||||
+ u32 hci_phy_ctl_clear;
|
||||
u8 phyctl_offset;
|
||||
bool dedicated_clocks;
|
||||
- bool enable_pmu_unk1;
|
||||
bool phy0_dual_route;
|
||||
int missing_phys;
|
||||
};
|
||||
@@ -288,6 +289,12 @@ static int sun4i_usb_phy_init(struct phy *_phy)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ if (phy->pmu && data->cfg->hci_phy_ctl_clear) {
|
||||
+ val = readl(phy->pmu + REG_HCI_PHY_CTL);
|
||||
+ val &= ~data->cfg->hci_phy_ctl_clear;
|
||||
+ writel(val, phy->pmu + REG_HCI_PHY_CTL);
|
||||
+ }
|
||||
+
|
||||
if (data->cfg->type == sun8i_a83t_phy ||
|
||||
data->cfg->type == sun50i_h6_phy) {
|
||||
if (phy->index == 0) {
|
||||
@@ -297,11 +304,6 @@ static int sun4i_usb_phy_init(struct phy *_phy)
|
||||
writel(val, data->base + data->cfg->phyctl_offset);
|
||||
}
|
||||
} else {
|
||||
- if (phy->pmu && data->cfg->enable_pmu_unk1) {
|
||||
- val = readl(phy->pmu + REG_PMU_UNK1);
|
||||
- writel(val & ~2, phy->pmu + REG_PMU_UNK1);
|
||||
- }
|
||||
-
|
||||
/* Enable USB 45 Ohm resistor calibration */
|
||||
if (phy->index == 0)
|
||||
sun4i_usb_phy_write(phy, PHY_RES45_CAL_EN, 0x01, 1);
|
||||
@@ -863,7 +865,6 @@ static const struct sun4i_usb_phy_cfg sun4i_a10_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A10,
|
||||
.dedicated_clocks = false,
|
||||
- .enable_pmu_unk1 = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_usb_phy_cfg sun5i_a13_cfg = {
|
||||
@@ -872,7 +873,6 @@ static const struct sun4i_usb_phy_cfg sun5i_a13_cfg = {
|
||||
.disc_thresh = 2,
|
||||
.phyctl_offset = REG_PHYCTL_A10,
|
||||
.dedicated_clocks = false,
|
||||
- .enable_pmu_unk1 = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_usb_phy_cfg sun6i_a31_cfg = {
|
||||
@@ -881,7 +881,6 @@ static const struct sun4i_usb_phy_cfg sun6i_a31_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A10,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_usb_phy_cfg sun7i_a20_cfg = {
|
||||
@@ -890,7 +889,6 @@ static const struct sun4i_usb_phy_cfg sun7i_a20_cfg = {
|
||||
.disc_thresh = 2,
|
||||
.phyctl_offset = REG_PHYCTL_A10,
|
||||
.dedicated_clocks = false,
|
||||
- .enable_pmu_unk1 = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_usb_phy_cfg sun8i_a23_cfg = {
|
||||
@@ -899,7 +897,6 @@ static const struct sun4i_usb_phy_cfg sun8i_a23_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A10,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_usb_phy_cfg sun8i_a33_cfg = {
|
||||
@@ -908,7 +905,6 @@ static const struct sun4i_usb_phy_cfg sun8i_a33_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A33,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = false,
|
||||
};
|
||||
|
||||
static const struct sun4i_usb_phy_cfg sun8i_a83t_cfg = {
|
||||
@@ -925,7 +921,7 @@ static const struct sun4i_usb_phy_cfg sun8i_h3_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A33,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = true,
|
||||
+ .hci_phy_ctl_clear = PHY_CTL_H3_SIDDQ,
|
||||
.phy0_dual_route = true,
|
||||
};
|
||||
|
||||
@@ -935,7 +931,7 @@ static const struct sun4i_usb_phy_cfg sun8i_r40_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A33,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = true,
|
||||
+ .hci_phy_ctl_clear = PHY_CTL_H3_SIDDQ,
|
||||
.phy0_dual_route = true,
|
||||
};
|
||||
|
||||
@@ -945,7 +941,7 @@ static const struct sun4i_usb_phy_cfg sun8i_v3s_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A33,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = true,
|
||||
+ .hci_phy_ctl_clear = PHY_CTL_H3_SIDDQ,
|
||||
.phy0_dual_route = true,
|
||||
};
|
||||
|
||||
@@ -955,7 +951,7 @@ static const struct sun4i_usb_phy_cfg sun50i_a64_cfg = {
|
||||
.disc_thresh = 3,
|
||||
.phyctl_offset = REG_PHYCTL_A33,
|
||||
.dedicated_clocks = true,
|
||||
- .enable_pmu_unk1 = true,
|
||||
+ .hci_phy_ctl_clear = PHY_CTL_H3_SIDDQ,
|
||||
.phy0_dual_route = true,
|
||||
};
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
From 70de28c88b747d01b33cdb9c3d4512ff5f8663aa Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Mon, 10 May 2021 11:01:31 +0100
|
||||
Subject: [PATCH 10/23] phy: sun4i-usb: Allow reset line to be shared
|
||||
|
||||
The USB HCIs (and PHYs?) in Allwinner's newer generation SoCs (H616)
|
||||
rely on the reset line of USB PHY 2 to be de-asserted, even when only
|
||||
one of the other PHYs is actually in use.
|
||||
|
||||
To make those ports work, we include this reset line in the HCIs' resets
|
||||
property, which requires this line to be shareable.
|
||||
|
||||
Change the call to allocate the reset line to mark it as shared, to
|
||||
enable the other ports on those SoCs.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/phy/allwinner/phy-sun4i-usb.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
index 142f4cafdc78..126ef74d013c 100644
|
||||
--- a/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
+++ b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
@@ -788,7 +788,7 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
snprintf(name, sizeof(name), "usb%d_reset", i);
|
||||
- phy->reset = devm_reset_control_get(dev, name);
|
||||
+ phy->reset = devm_reset_control_get_shared(dev, name);
|
||||
if (IS_ERR(phy->reset)) {
|
||||
dev_err(dev, "failed to get reset %s\n", name);
|
||||
return PTR_ERR(phy->reset);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,117 @@
|
||||
From 629a19cc09aab0005e51d9fd525ca66d7f3a7cd2 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Mon, 10 May 2021 11:01:31 +0100
|
||||
Subject: [PATCH 11/23] phy: sun4i-usb: Introduce port2 SIDDQ quirk
|
||||
|
||||
At least the Allwinner H616 SoC requires a weird quirk to make most
|
||||
USB PHYs work: Only port2 works out of the box, but all other ports
|
||||
need some help from this port2 to work correctly: The CLK_BUS_PHY2 and
|
||||
RST_USB_PHY2 clock and reset need to be enabled, and the SIDDQ bit in
|
||||
the PMU PHY control register needs to be cleared. For this register to
|
||||
be accessible, CLK_BUS_ECHI2 needs to be ungated. Don't ask ....
|
||||
|
||||
Instead of disguising this as some generic feature, do exactly that
|
||||
in our PHY init:
|
||||
If the quirk bit is set, and we initialise a PHY other than PHY2, ungate
|
||||
this one special clock, and clear the SIDDQ bit. We can pull in the
|
||||
other required clocks via the DT.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/phy/allwinner/phy-sun4i-usb.c | 59 +++++++++++++++++++++++++++
|
||||
1 file changed, 59 insertions(+)
|
||||
|
||||
diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
index 126ef74d013c..316ef5fca831 100644
|
||||
--- a/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
+++ b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
@@ -120,6 +120,7 @@ struct sun4i_usb_phy_cfg {
|
||||
u8 phyctl_offset;
|
||||
bool dedicated_clocks;
|
||||
bool phy0_dual_route;
|
||||
+ bool needs_phy2_siddq;
|
||||
int missing_phys;
|
||||
};
|
||||
|
||||
@@ -289,6 +290,50 @@ static int sun4i_usb_phy_init(struct phy *_phy)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ /* Some PHYs on some SoCs need the help of PHY2 to work. */
|
||||
+ if (data->cfg->needs_phy2_siddq && phy->index != 2) {
|
||||
+ struct sun4i_usb_phy *phy2 = &data->phys[2];
|
||||
+
|
||||
+ ret = clk_prepare_enable(phy2->clk);
|
||||
+ if (ret) {
|
||||
+ reset_control_assert(phy->reset);
|
||||
+ clk_disable_unprepare(phy->clk2);
|
||||
+ clk_disable_unprepare(phy->clk);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = reset_control_deassert(phy2->reset);
|
||||
+ if (ret) {
|
||||
+ clk_disable_unprepare(phy2->clk);
|
||||
+ reset_control_assert(phy->reset);
|
||||
+ clk_disable_unprepare(phy->clk2);
|
||||
+ clk_disable_unprepare(phy->clk);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * This extra clock is just needed to access the
|
||||
+ * REG_HCI_PHY_CTL PMU register for PHY2.
|
||||
+ */
|
||||
+ ret = clk_prepare_enable(phy2->clk2);
|
||||
+ if (ret) {
|
||||
+ reset_control_assert(phy2->reset);
|
||||
+ clk_disable_unprepare(phy2->clk);
|
||||
+ reset_control_assert(phy->reset);
|
||||
+ clk_disable_unprepare(phy->clk2);
|
||||
+ clk_disable_unprepare(phy->clk);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (phy2->pmu && data->cfg->hci_phy_ctl_clear) {
|
||||
+ val = readl(phy2->pmu + REG_HCI_PHY_CTL);
|
||||
+ val &= ~data->cfg->hci_phy_ctl_clear;
|
||||
+ writel(val, phy2->pmu + REG_HCI_PHY_CTL);
|
||||
+ }
|
||||
+
|
||||
+ clk_disable_unprepare(phy->clk2);
|
||||
+ }
|
||||
+
|
||||
if (phy->pmu && data->cfg->hci_phy_ctl_clear) {
|
||||
val = readl(phy->pmu + REG_HCI_PHY_CTL);
|
||||
val &= ~data->cfg->hci_phy_ctl_clear;
|
||||
@@ -354,6 +399,13 @@ static int sun4i_usb_phy_exit(struct phy *_phy)
|
||||
data->phy0_init = false;
|
||||
}
|
||||
|
||||
+ if (data->cfg->needs_phy2_siddq && phy->index != 2) {
|
||||
+ struct sun4i_usb_phy *phy2 = &data->phys[2];
|
||||
+
|
||||
+ clk_disable_unprepare(phy2->clk);
|
||||
+ reset_control_assert(phy2->reset);
|
||||
+ }
|
||||
+
|
||||
sun4i_usb_phy_passby(phy, 0);
|
||||
reset_control_assert(phy->reset);
|
||||
clk_disable_unprepare(phy->clk2);
|
||||
@@ -785,6 +837,13 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
|
||||
dev_err(dev, "failed to get clock %s\n", name);
|
||||
return PTR_ERR(phy->clk2);
|
||||
}
|
||||
+ } else {
|
||||
+ snprintf(name, sizeof(name), "pmu%d_clk", i);
|
||||
+ phy->clk2 = devm_clk_get_optional(dev, name);
|
||||
+ if (IS_ERR(phy->clk2)) {
|
||||
+ dev_err(dev, "failed to get clock %s\n", name);
|
||||
+ return PTR_ERR(phy->clk2);
|
||||
+ }
|
||||
}
|
||||
|
||||
snprintf(name, sizeof(name), "usb%d_reset", i);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,51 @@
|
||||
From b7cee5b9fd53d18629de342c917a8fbea678aa39 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Sun, 6 Dec 2020 01:40:16 +0000
|
||||
Subject: [PATCH 12/23] phy: sun4i-usb: Add support for the H616 USB PHY
|
||||
|
||||
The USB PHY used in the Allwinner H616 SoC inherits some traits from its
|
||||
various predecessors: it has four full PHYs like the H3, needs some
|
||||
extra bits to be set like the H6, and puts SIDDQ on a different bit like
|
||||
the A100. Plus it needs this weird PHY2 quirk.
|
||||
|
||||
Name all those properties in a new config struct and assign a new
|
||||
compatible name to it.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/phy/allwinner/phy-sun4i-usb.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
index 316ef5fca831..85a9771280b7 100644
|
||||
--- a/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
+++ b/drivers/phy/allwinner/phy-sun4i-usb.c
|
||||
@@ -1024,6 +1024,17 @@ static const struct sun4i_usb_phy_cfg sun50i_h6_cfg = {
|
||||
.missing_phys = BIT(1) | BIT(2),
|
||||
};
|
||||
|
||||
+static const struct sun4i_usb_phy_cfg sun50i_h616_cfg = {
|
||||
+ .num_phys = 4,
|
||||
+ .type = sun50i_h6_phy,
|
||||
+ .disc_thresh = 3,
|
||||
+ .phyctl_offset = REG_PHYCTL_A33,
|
||||
+ .dedicated_clocks = true,
|
||||
+ .phy0_dual_route = true,
|
||||
+ .hci_phy_ctl_clear = PHY_CTL_SIDDQ,
|
||||
+ .needs_phy2_siddq = true,
|
||||
+};
|
||||
+
|
||||
static const struct of_device_id sun4i_usb_phy_of_match[] = {
|
||||
{ .compatible = "allwinner,sun4i-a10-usb-phy", .data = &sun4i_a10_cfg },
|
||||
{ .compatible = "allwinner,sun5i-a13-usb-phy", .data = &sun5i_a13_cfg },
|
||||
@@ -1038,6 +1049,7 @@ static const struct of_device_id sun4i_usb_phy_of_match[] = {
|
||||
{ .compatible = "allwinner,sun50i-a64-usb-phy",
|
||||
.data = &sun50i_a64_cfg},
|
||||
{ .compatible = "allwinner,sun50i-h6-usb-phy", .data = &sun50i_h6_cfg },
|
||||
+ { .compatible = "allwinner,sun50i-h616-usb-phy", .data = &sun50i_h616_cfg },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sun4i_usb_phy_of_match);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,190 @@
|
||||
From b78f977c6abefecfc90c995f9808250da2a6fb9f Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 16 Jun 2021 18:20:47 +0100
|
||||
Subject: [PATCH 13/23] arm64: dts: allwinner: h616: Add USB nodes
|
||||
|
||||
Add the nodes for the MUSB and the four USB host controllers to the SoC
|
||||
.dtsi, along with the PHY node needed to bind all of them together.
|
||||
|
||||
EHCI/OHCI and MUSB are compatible to previous SoCs, but the PHY requires
|
||||
some quirks (handled in the driver).
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
.../arm64/boot/dts/allwinner/sun50i-h616.dtsi | 160 ++++++++++++++++++
|
||||
1 file changed, 160 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
index 0ad0c25b4c83..7681f2a68dee 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
@@ -494,6 +494,166 @@ mdio0: mdio {
|
||||
};
|
||||
};
|
||||
|
||||
+ usbotg: usb@5100000 {
|
||||
+ compatible = "allwinner,sun50i-h616-musb",
|
||||
+ "allwinner,sun8i-h3-musb";
|
||||
+ reg = <0x05100000 0x0400>;
|
||||
+ clocks = <&ccu CLK_BUS_OTG>;
|
||||
+ resets = <&ccu RST_BUS_OTG>;
|
||||
+ interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interrupt-names = "mc";
|
||||
+ phys = <&usbphy 0>;
|
||||
+ phy-names = "usb";
|
||||
+ extcon = <&usbphy 0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ usbphy: phy@5100400 {
|
||||
+ compatible = "allwinner,sun50i-h616-usb-phy";
|
||||
+ reg = <0x05100400 0x24>,
|
||||
+ <0x05101800 0x14>,
|
||||
+ <0x05200800 0x14>,
|
||||
+ <0x05310800 0x14>,
|
||||
+ <0x05311800 0x14>;
|
||||
+ reg-names = "phy_ctrl",
|
||||
+ "pmu0",
|
||||
+ "pmu1",
|
||||
+ "pmu2",
|
||||
+ "pmu3";
|
||||
+ clocks = <&ccu CLK_USB_PHY0>,
|
||||
+ <&ccu CLK_USB_PHY1>,
|
||||
+ <&ccu CLK_USB_PHY2>,
|
||||
+ <&ccu CLK_USB_PHY3>,
|
||||
+ <&ccu CLK_BUS_EHCI2>;
|
||||
+ clock-names = "usb0_phy",
|
||||
+ "usb1_phy",
|
||||
+ "usb2_phy",
|
||||
+ "usb3_phy",
|
||||
+ "pmu2_clk";
|
||||
+ resets = <&ccu RST_USB_PHY0>,
|
||||
+ <&ccu RST_USB_PHY1>,
|
||||
+ <&ccu RST_USB_PHY2>,
|
||||
+ <&ccu RST_USB_PHY3>;
|
||||
+ reset-names = "usb0_reset",
|
||||
+ "usb1_reset",
|
||||
+ "usb2_reset",
|
||||
+ "usb3_reset";
|
||||
+ status = "disabled";
|
||||
+ #phy-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ ehci0: usb@5101000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05101000 0x100>;
|
||||
+ interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI0>,
|
||||
+ <&ccu CLK_BUS_EHCI0>,
|
||||
+ <&ccu CLK_USB_OHCI0>;
|
||||
+ resets = <&ccu RST_BUS_OHCI0>,
|
||||
+ <&ccu RST_BUS_EHCI0>;
|
||||
+ phys = <&usbphy 0>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci0: usb@5101400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05101400 0x100>;
|
||||
+ interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI0>,
|
||||
+ <&ccu CLK_USB_OHCI0>;
|
||||
+ resets = <&ccu RST_BUS_OHCI0>;
|
||||
+ phys = <&usbphy 0>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ehci1: usb@5200000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05200000 0x100>;
|
||||
+ interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI1>,
|
||||
+ <&ccu CLK_BUS_EHCI1>,
|
||||
+ <&ccu CLK_USB_OHCI1>;
|
||||
+ resets = <&ccu RST_BUS_OHCI1>,
|
||||
+ <&ccu RST_BUS_EHCI1>;
|
||||
+ phys = <&usbphy 1>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci1: usb@5200400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05200400 0x100>;
|
||||
+ interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI1>,
|
||||
+ <&ccu CLK_USB_OHCI1>;
|
||||
+ resets = <&ccu RST_BUS_OHCI1>;
|
||||
+ phys = <&usbphy 1>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ehci2: usb@5310000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05310000 0x100>;
|
||||
+ interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI2>,
|
||||
+ <&ccu CLK_BUS_EHCI2>,
|
||||
+ <&ccu CLK_USB_OHCI2>;
|
||||
+ resets = <&ccu RST_BUS_OHCI2>,
|
||||
+ <&ccu RST_BUS_EHCI2>;
|
||||
+ phys = <&usbphy 2>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci2: usb@5310400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05310400 0x100>;
|
||||
+ interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI2>,
|
||||
+ <&ccu CLK_USB_OHCI2>;
|
||||
+ resets = <&ccu RST_BUS_OHCI2>;
|
||||
+ phys = <&usbphy 2>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ehci3: usb@5311000 {
|
||||
+ compatible = "allwinner,sun50i-h616-ehci",
|
||||
+ "generic-ehci";
|
||||
+ reg = <0x05311000 0x100>;
|
||||
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI3>,
|
||||
+ <&ccu CLK_BUS_EHCI3>,
|
||||
+ <&ccu CLK_USB_OHCI3>;
|
||||
+ resets = <&ccu RST_BUS_OHCI3>,
|
||||
+ <&ccu RST_BUS_EHCI3>;
|
||||
+ phys = <&usbphy 3>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ ohci3: usb@5311400 {
|
||||
+ compatible = "allwinner,sun50i-h616-ohci",
|
||||
+ "generic-ohci";
|
||||
+ reg = <0x05311400 0x100>;
|
||||
+ interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_OHCI3>,
|
||||
+ <&ccu CLK_USB_OHCI3>;
|
||||
+ resets = <&ccu RST_BUS_OHCI3>;
|
||||
+ phys = <&usbphy 3>;
|
||||
+ phy-names = "usb";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
r_ccu: clock@7010000 {
|
||||
compatible = "allwinner,sun50i-h616-r-ccu";
|
||||
reg = <0x07010000 0x210>;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,85 @@
|
||||
From 11c36003850ca252017cca807e8aaad274645a8c Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 16 Jun 2021 18:32:36 +0100
|
||||
Subject: [PATCH 14/23] arm64: dts: allwinner: h616: OrangePi Zero 2: Add USB
|
||||
nodes
|
||||
|
||||
The OrangePi Zero 2 has one USB-A host port, VBUS is provided by
|
||||
a GPIO controlled regulator.
|
||||
The USB-C port is meant to power the board, but is also connected to
|
||||
the USB 0 port, which we configure as an MUSB peripheral.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
.../allwinner/sun50i-h616-orangepi-zero2.dts | 42 +++++++++++++++++++
|
||||
1 file changed, 42 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts b/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
|
||||
index ca07cae698ce..a26201288872 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dts
|
||||
@@ -49,8 +49,25 @@ reg_vcc5v: vcc5v {
|
||||
regulator-max-microvolt = <5000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
+
|
||||
+ reg_usb1_vbus: usb1-vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "usb1-vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ vin-supply = <®_vcc5v>;
|
||||
+ enable-active-high;
|
||||
+ gpio = <&pio 2 16 GPIO_ACTIVE_HIGH>; /* PC16 */
|
||||
+ status = "okay";
|
||||
+ };
|
||||
};
|
||||
|
||||
+&ehci1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+/* USB 2 & 3 are on headers only. */
|
||||
+
|
||||
&emac0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ext_rgmii_pins>;
|
||||
@@ -76,6 +93,10 @@ &mmc0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&ohci1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&r_rsb {
|
||||
status = "okay";
|
||||
|
||||
@@ -201,3 +222,24 @@ &uart0 {
|
||||
pinctrl-0 = <&uart0_ph_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&usbotg {
|
||||
+ /*
|
||||
+ * PHY0 pins are connected to a USB-C socket, but a role switch
|
||||
+ * is not implemented: both CC pins are pulled to GND.
|
||||
+ * The VBUS pins power the device, so a fixed peripheral mode
|
||||
+ * is the best choice.
|
||||
+ * The board can be powered via GPIOs, in this case port0 *can*
|
||||
+ * act as a host (with a cable/adapter ignoring CC), as VBUS is
|
||||
+ * then provided by the GPIOs. Any user of this setup would
|
||||
+ * need to adjust the DT accordingly: dr_mode set to "host",
|
||||
+ * enabling OHCI0 and EHCI0.
|
||||
+ */
|
||||
+ dr_mode = "peripheral";
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbphy {
|
||||
+ usb1_vbus-supply = <®_usb1_vbus>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
From 506dc58a250db76e2208ce329b9f39d3da049dab Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 16 Jun 2021 18:33:42 +0100
|
||||
Subject: [PATCH 15/23] arm64: dts: allwinner: h616: X96 Mate: Add USB nodes
|
||||
|
||||
The X96 Mate TV box has two USB-A ports, VBUS is always on and connected
|
||||
to the DC input.
|
||||
Since USB port 0 is connected to an USB-A receptable, we configure it
|
||||
as a host port. Using it as a peripheral is dangerous, because VBUS is
|
||||
always on.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
.../dts/allwinner/sun50i-h616-x96-mate.dts | 25 +++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts b/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts
|
||||
index aedb3a3dff38..5c3586717c00 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616-x96-mate.dts
|
||||
@@ -32,6 +32,14 @@ reg_vcc5v: vcc5v {
|
||||
};
|
||||
};
|
||||
|
||||
+&ehci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ehci2 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&ir {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -54,6 +62,14 @@ &mmc2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&ohci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci2 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&r_rsb {
|
||||
status = "okay";
|
||||
|
||||
@@ -175,3 +191,12 @@ &uart0 {
|
||||
pinctrl-0 = <&uart0_ph_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&usbotg {
|
||||
+ dr_mode = "host"; /* USB A type receptable */
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbphy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,36 @@
|
||||
From 63c5e1db13fa936d46da486d4d312a8cb52da7d8 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 27 Jan 2021 13:27:39 +0000
|
||||
Subject: [PATCH 16/23] dt-bindings: net: sun8i-emac: Add H616 compatible
|
||||
string
|
||||
|
||||
Add the obvious compatible name to the existing EMAC binding, and pair
|
||||
it with the existing A64 fallback compatible string, as the devices are
|
||||
compatible.
|
||||
|
||||
On the way use enums to group the compatible devices together.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
.../devicetree/bindings/net/allwinner,sun8i-a83t-emac.yaml | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/net/allwinner,sun8i-a83t-emac.yaml b/Documentation/devicetree/bindings/net/allwinner,sun8i-a83t-emac.yaml
|
||||
index 7f2578d48e3f..0ccdab103f59 100644
|
||||
--- a/Documentation/devicetree/bindings/net/allwinner,sun8i-a83t-emac.yaml
|
||||
+++ b/Documentation/devicetree/bindings/net/allwinner,sun8i-a83t-emac.yaml
|
||||
@@ -19,7 +19,9 @@ properties:
|
||||
- const: allwinner,sun8i-v3s-emac
|
||||
- const: allwinner,sun50i-a64-emac
|
||||
- items:
|
||||
- - const: allwinner,sun50i-h6-emac
|
||||
+ - enum:
|
||||
+ - allwinner,sun50i-h6-emac
|
||||
+ - allwinner,sun50i-h616-emac
|
||||
- const: allwinner,sun50i-a64-emac
|
||||
|
||||
reg:
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,65 @@
|
||||
From c873c54739d24511e65039e0a6a13dbf449f0822 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Thu, 10 Dec 2020 14:42:12 +0000
|
||||
Subject: [PATCH 17/23] net: stmmac: dwmac-sun8i: Prepare for second EMAC clock
|
||||
register
|
||||
|
||||
The Allwinner H616 SoC has two EMAC controllers, with the second one
|
||||
being tied to the internal PHY, but also using a separate EMAC clock
|
||||
register.
|
||||
|
||||
To tell the driver about which clock register to use, we add a parameter
|
||||
to our syscon phandle. The driver will use this value as an index into
|
||||
the regmap, so that we can address more than the first register, if
|
||||
needed.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 12 ++++++++++--
|
||||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
index 4422baeed3d8..5f3fefd9a74e 100644
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
@@ -1147,11 +1147,13 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
|
||||
struct stmmac_resources stmmac_res;
|
||||
struct sunxi_priv_data *gmac;
|
||||
struct device *dev = &pdev->dev;
|
||||
+ struct reg_field syscon_field;
|
||||
phy_interface_t interface;
|
||||
int ret;
|
||||
struct stmmac_priv *priv;
|
||||
struct net_device *ndev;
|
||||
struct regmap *regmap;
|
||||
+ u32 syscon_idx = 0;
|
||||
|
||||
ret = stmmac_get_platform_resources(pdev, &stmmac_res);
|
||||
if (ret)
|
||||
@@ -1209,8 +1211,12 @@ static int sun8i_dwmac_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- gmac->regmap_field = devm_regmap_field_alloc(dev, regmap,
|
||||
- *gmac->variant->syscon_field);
|
||||
+ syscon_field = *gmac->variant->syscon_field;
|
||||
+ ret = of_property_read_u32_index(pdev->dev.of_node, "syscon", 1,
|
||||
+ &syscon_idx);
|
||||
+ if (!ret)
|
||||
+ syscon_field.reg += syscon_idx * sizeof(u32);
|
||||
+ gmac->regmap_field = devm_regmap_field_alloc(dev, regmap, syscon_field);
|
||||
if (IS_ERR(gmac->regmap_field)) {
|
||||
ret = PTR_ERR(gmac->regmap_field);
|
||||
dev_err(dev, "Unable to map syscon register: %d\n", ret);
|
||||
@@ -1330,6 +1336,8 @@ static const struct of_device_id sun8i_dwmac_match[] = {
|
||||
.data = &emac_variant_a64 },
|
||||
{ .compatible = "allwinner,sun50i-h6-emac",
|
||||
.data = &emac_variant_h6 },
|
||||
+ { .compatible = "allwinner,sun50i-h616-emac",
|
||||
+ .data = &emac_variant_h6 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sun8i_dwmac_match);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
From b9dcf9e120fd83c7d4d3bceb45467cc239c8039f Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Thu, 10 Dec 2020 22:42:55 +0000
|
||||
Subject: [PATCH 18/23] dt-bindings: rtc: sun6i: Add H616 compatible string
|
||||
|
||||
Add the obvious compatible name to the existing RTC binding.
|
||||
The actual RTC part of the device uses a different day/month/year
|
||||
storage scheme, so it's not compatible with the previous devices.
|
||||
Also the clock part is quite different, as there is no external 32K LOSC
|
||||
oscillator input.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
.../bindings/rtc/allwinner,sun6i-a31-rtc.yaml | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml b/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
|
||||
index b1b0ee769b71..2c3fd72e17ee 100644
|
||||
--- a/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
|
||||
+++ b/Documentation/devicetree/bindings/rtc/allwinner,sun6i-a31-rtc.yaml
|
||||
@@ -26,6 +26,7 @@ properties:
|
||||
- const: allwinner,sun50i-a64-rtc
|
||||
- const: allwinner,sun8i-h3-rtc
|
||||
- const: allwinner,sun50i-h6-rtc
|
||||
+ - const: allwinner,sun50i-h616-rtc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@@ -105,6 +106,20 @@ allOf:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
|
||||
+ - if:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ contains:
|
||||
+ const: allwinner,sun50i-h616-rtc
|
||||
+
|
||||
+ then:
|
||||
+ properties:
|
||||
+ clock-output-names:
|
||||
+ minItems: 3
|
||||
+ maxItems: 3
|
||||
+ clocks:
|
||||
+ maxItems: 0
|
||||
+
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,146 @@
|
||||
From eccdbbb097217408d1c14a11497717dd97df04d7 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Fri, 26 Feb 2021 10:27:51 +0000
|
||||
Subject: [PATCH 19/23] rtc: sun6i: Add support for linear day storage
|
||||
|
||||
Newer versions of the Allwinner RTC, as for instance found in the H616
|
||||
SoC, no longer store a broken-down day/month/year representation in the
|
||||
RTC_DAY_REG, but just a linear day number.
|
||||
The user manual does not give any indication about the expected epoch
|
||||
time of this day count, but the BSP kernel uses the UNIX epoch, which
|
||||
allows easy support due to existing conversion functions in the kernel.
|
||||
|
||||
Allow tagging a compatible string with a flag, and use that to mark
|
||||
those new RTCs. Then convert between a UNIX day number (converted into
|
||||
seconds) and the broken-down day representation using mktime64() and
|
||||
time64_to_tm() in the set_time/get_time functions.
|
||||
|
||||
That enables support for the RTC in those new chips.
|
||||
|
||||
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/rtc/rtc-sun6i.c | 66 +++++++++++++++++++++++++++--------------
|
||||
1 file changed, 44 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
|
||||
index adec1b14a8de..e4fc6e4f2bfb 100644
|
||||
--- a/drivers/rtc/rtc-sun6i.c
|
||||
+++ b/drivers/rtc/rtc-sun6i.c
|
||||
@@ -110,6 +110,8 @@
|
||||
#define SUN6I_YEAR_MIN 1970
|
||||
#define SUN6I_YEAR_OFF (SUN6I_YEAR_MIN - 1900)
|
||||
|
||||
+#define SEC_PER_DAY (24 * 3600ULL)
|
||||
+
|
||||
/*
|
||||
* There are other differences between models, including:
|
||||
*
|
||||
@@ -133,12 +135,15 @@ struct sun6i_rtc_clk_data {
|
||||
unsigned int has_auto_swt : 1;
|
||||
};
|
||||
|
||||
+#define RTC_LINEAR_DAY BIT(0)
|
||||
+
|
||||
struct sun6i_rtc_dev {
|
||||
struct rtc_device *rtc;
|
||||
const struct sun6i_rtc_clk_data *data;
|
||||
void __iomem *base;
|
||||
int irq;
|
||||
unsigned long alarm;
|
||||
+ unsigned long flags;
|
||||
|
||||
struct clk_hw hw;
|
||||
struct clk_hw *int_osc;
|
||||
@@ -467,22 +472,30 @@ static int sun6i_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
|
||||
} while ((date != readl(chip->base + SUN6I_RTC_YMD)) ||
|
||||
(time != readl(chip->base + SUN6I_RTC_HMS)));
|
||||
|
||||
+ if (chip->flags & RTC_LINEAR_DAY) {
|
||||
+ /*
|
||||
+ * Newer chips store a linear day number, the manual
|
||||
+ * does not mandate any epoch base. The BSP driver uses
|
||||
+ * the UNIX epoch, let's just copy that, as it's the
|
||||
+ * easiest anyway.
|
||||
+ */
|
||||
+ rtc_time64_to_tm((date & 0xffff) * SEC_PER_DAY, rtc_tm);
|
||||
+ } else {
|
||||
+ rtc_tm->tm_mday = SUN6I_DATE_GET_DAY_VALUE(date);
|
||||
+ rtc_tm->tm_mon = SUN6I_DATE_GET_MON_VALUE(date) - 1;
|
||||
+ rtc_tm->tm_year = SUN6I_DATE_GET_YEAR_VALUE(date);
|
||||
+
|
||||
+ /*
|
||||
+ * switch from (data_year->min)-relative offset to
|
||||
+ * a (1900)-relative one
|
||||
+ */
|
||||
+ rtc_tm->tm_year += SUN6I_YEAR_OFF;
|
||||
+ }
|
||||
+
|
||||
rtc_tm->tm_sec = SUN6I_TIME_GET_SEC_VALUE(time);
|
||||
rtc_tm->tm_min = SUN6I_TIME_GET_MIN_VALUE(time);
|
||||
rtc_tm->tm_hour = SUN6I_TIME_GET_HOUR_VALUE(time);
|
||||
|
||||
- rtc_tm->tm_mday = SUN6I_DATE_GET_DAY_VALUE(date);
|
||||
- rtc_tm->tm_mon = SUN6I_DATE_GET_MON_VALUE(date);
|
||||
- rtc_tm->tm_year = SUN6I_DATE_GET_YEAR_VALUE(date);
|
||||
-
|
||||
- rtc_tm->tm_mon -= 1;
|
||||
-
|
||||
- /*
|
||||
- * switch from (data_year->min)-relative offset to
|
||||
- * a (1900)-relative one
|
||||
- */
|
||||
- rtc_tm->tm_year += SUN6I_YEAR_OFF;
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -571,20 +584,27 @@ static int sun6i_rtc_settime(struct device *dev, struct rtc_time *rtc_tm)
|
||||
u32 date = 0;
|
||||
u32 time = 0;
|
||||
|
||||
- rtc_tm->tm_year -= SUN6I_YEAR_OFF;
|
||||
- rtc_tm->tm_mon += 1;
|
||||
-
|
||||
- date = SUN6I_DATE_SET_DAY_VALUE(rtc_tm->tm_mday) |
|
||||
- SUN6I_DATE_SET_MON_VALUE(rtc_tm->tm_mon) |
|
||||
- SUN6I_DATE_SET_YEAR_VALUE(rtc_tm->tm_year);
|
||||
-
|
||||
- if (is_leap_year(rtc_tm->tm_year + SUN6I_YEAR_MIN))
|
||||
- date |= SUN6I_LEAP_SET_VALUE(1);
|
||||
-
|
||||
time = SUN6I_TIME_SET_SEC_VALUE(rtc_tm->tm_sec) |
|
||||
SUN6I_TIME_SET_MIN_VALUE(rtc_tm->tm_min) |
|
||||
SUN6I_TIME_SET_HOUR_VALUE(rtc_tm->tm_hour);
|
||||
|
||||
+ if (chip->flags & RTC_LINEAR_DAY) {
|
||||
+ rtc_tm->tm_sec = 0;
|
||||
+ rtc_tm->tm_min = 0;
|
||||
+ rtc_tm->tm_hour = 0;
|
||||
+ date = rtc_tm_to_time64(rtc_tm) / SEC_PER_DAY;
|
||||
+ } else {
|
||||
+ rtc_tm->tm_year -= SUN6I_YEAR_OFF;
|
||||
+ rtc_tm->tm_mon += 1;
|
||||
+
|
||||
+ date = SUN6I_DATE_SET_DAY_VALUE(rtc_tm->tm_mday) |
|
||||
+ SUN6I_DATE_SET_MON_VALUE(rtc_tm->tm_mon) |
|
||||
+ SUN6I_DATE_SET_YEAR_VALUE(rtc_tm->tm_year);
|
||||
+
|
||||
+ if (is_leap_year(rtc_tm->tm_year + SUN6I_YEAR_MIN))
|
||||
+ date |= SUN6I_LEAP_SET_VALUE(1);
|
||||
+ }
|
||||
+
|
||||
/* Check whether registers are writable */
|
||||
if (sun6i_rtc_wait(chip, SUN6I_LOSC_CTRL,
|
||||
SUN6I_LOSC_CTRL_ACC_MASK, 50)) {
|
||||
@@ -678,6 +698,8 @@ static int sun6i_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, chip);
|
||||
|
||||
+ chip->flags = (unsigned long)of_device_get_match_data(&pdev->dev);
|
||||
+
|
||||
chip->irq = platform_get_irq(pdev, 0);
|
||||
if (chip->irq < 0)
|
||||
return chip->irq;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,112 @@
|
||||
From dc5413b704ec0f95d5b6c4f752f25214f2d05e2e Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Fri, 4 Jun 2021 12:12:27 +0100
|
||||
Subject: [PATCH 20/23] rtc: sun6i: Add support for broken-down alarm registers
|
||||
|
||||
Newer versions of the Allwinner RTC, for instance as found in the H616
|
||||
SoC, not only store the current day as a linear number, but also change
|
||||
the way the alarm is handled: There are now two registers, that
|
||||
explicitly store the wakeup time, in the same format as the current
|
||||
time.
|
||||
|
||||
Add support for that variant by writing the requested wakeup time
|
||||
directly into the registers, instead of programming the seconds left, as
|
||||
the old SoCs required.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/rtc/rtc-sun6i.c | 60 +++++++++++++++++++++++++++--------------
|
||||
1 file changed, 40 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
|
||||
index e4fc6e4f2bfb..54bd47fb0a5f 100644
|
||||
--- a/drivers/rtc/rtc-sun6i.c
|
||||
+++ b/drivers/rtc/rtc-sun6i.c
|
||||
@@ -48,7 +48,8 @@
|
||||
|
||||
/* Alarm 0 (counter) */
|
||||
#define SUN6I_ALRM_COUNTER 0x0020
|
||||
-#define SUN6I_ALRM_CUR_VAL 0x0024
|
||||
+/* This holds the remaining alarm seconds on older SoCs (current value) */
|
||||
+#define SUN6I_ALRM_COUNTER_HMS 0x0024
|
||||
#define SUN6I_ALRM_EN 0x0028
|
||||
#define SUN6I_ALRM_EN_CNT_EN BIT(0)
|
||||
#define SUN6I_ALRM_IRQ_EN 0x002c
|
||||
@@ -523,36 +524,55 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
|
||||
struct sun6i_rtc_dev *chip = dev_get_drvdata(dev);
|
||||
struct rtc_time *alrm_tm = &wkalrm->time;
|
||||
struct rtc_time tm_now;
|
||||
- unsigned long time_now = 0;
|
||||
unsigned long time_set = 0;
|
||||
- unsigned long time_gap = 0;
|
||||
+ unsigned long counter_val, counter_val_hms;
|
||||
int ret = 0;
|
||||
|
||||
- ret = sun6i_rtc_gettime(dev, &tm_now);
|
||||
- if (ret < 0) {
|
||||
- dev_err(dev, "Error in getting time\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
time_set = rtc_tm_to_time64(alrm_tm);
|
||||
- time_now = rtc_tm_to_time64(&tm_now);
|
||||
- if (time_set <= time_now) {
|
||||
- dev_err(dev, "Date to set in the past\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- time_gap = time_set - time_now;
|
||||
|
||||
- if (time_gap > U32_MAX) {
|
||||
- dev_err(dev, "Date too far in the future\n");
|
||||
- return -EINVAL;
|
||||
+ if (chip->flags & RTC_LINEAR_DAY) {
|
||||
+ /*
|
||||
+ * The alarm registers hold the actual alarm time, encoded
|
||||
+ * in the same way (linear day + HMS) as the current time.
|
||||
+ */
|
||||
+ counter_val_hms = SUN6I_TIME_SET_SEC_VALUE(alrm_tm->tm_sec) |
|
||||
+ SUN6I_TIME_SET_MIN_VALUE(alrm_tm->tm_min) |
|
||||
+ SUN6I_TIME_SET_HOUR_VALUE(alrm_tm->tm_hour);
|
||||
+ counter_val = mktime64(alrm_tm->tm_year + 1900, alrm_tm->tm_mon,
|
||||
+ alrm_tm->tm_mday, 0, 0, 0) / SEC_PER_DAY;
|
||||
+ } else {
|
||||
+ /* The alarm register holds the number of seconds left. */
|
||||
+ unsigned long time_now;
|
||||
+
|
||||
+ ret = sun6i_rtc_gettime(dev, &tm_now);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "Error in getting time\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ time_now = rtc_tm_to_time64(&tm_now);
|
||||
+ if (time_set <= time_now) {
|
||||
+ dev_err(dev, "Date to set in the past\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ counter_val = time_set - time_now;
|
||||
+
|
||||
+ if (counter_val > U32_MAX) {
|
||||
+ dev_err(dev, "Date too far in the future\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
}
|
||||
|
||||
sun6i_rtc_setaie(0, chip);
|
||||
writel(0, chip->base + SUN6I_ALRM_COUNTER);
|
||||
+ if (chip->flags & RTC_LINEAR_DAY)
|
||||
+ writel(0, chip->base + SUN6I_ALRM_COUNTER_HMS);
|
||||
usleep_range(100, 300);
|
||||
|
||||
- writel(time_gap, chip->base + SUN6I_ALRM_COUNTER);
|
||||
+ writel(counter_val, chip->base + SUN6I_ALRM_COUNTER);
|
||||
+ if (chip->flags & RTC_LINEAR_DAY)
|
||||
+ writel(counter_val_hms, chip->base + SUN6I_ALRM_COUNTER_HMS);
|
||||
chip->alarm = time_set;
|
||||
|
||||
sun6i_rtc_setaie(wkalrm->enabled, chip);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,67 @@
|
||||
From 9dcadc898af3795e1ec17c0656b884b2f802c609 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Mon, 14 Jun 2021 23:02:45 +0100
|
||||
Subject: [PATCH 21/23] rtc: sun6i: Add support for RTCs without external LOSCs
|
||||
|
||||
Some newer Allwinner RTCs (for instance the one in the H616 SoC) lack
|
||||
a pin for an external 32768 Hz oscillator. As a consequence, this LOSC
|
||||
can't be selected as the RTC clock source, and we must rely on the
|
||||
internal RC oscillator.
|
||||
To allow additions of clocks to the RTC node, add a feature bit to ignore
|
||||
any provided clocks for now (the current code would think this is the
|
||||
external LOSC). Later DTs and code can then for instance add the PLL
|
||||
based clock input, and older kernel won't get confused.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/rtc/rtc-sun6i.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
|
||||
index 54bd47fb0a5f..1fabb3c69041 100644
|
||||
--- a/drivers/rtc/rtc-sun6i.c
|
||||
+++ b/drivers/rtc/rtc-sun6i.c
|
||||
@@ -134,6 +134,7 @@ struct sun6i_rtc_clk_data {
|
||||
unsigned int export_iosc : 1;
|
||||
unsigned int has_losc_en : 1;
|
||||
unsigned int has_auto_swt : 1;
|
||||
+ unsigned int no_ext_losc : 1;
|
||||
};
|
||||
|
||||
#define RTC_LINEAR_DAY BIT(0)
|
||||
@@ -256,7 +257,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
|
||||
}
|
||||
|
||||
/* Switch to the external, more precise, oscillator, if present */
|
||||
- if (of_get_property(node, "clocks", NULL)) {
|
||||
+ if (!rtc->data->no_ext_losc && of_get_property(node, "clocks", NULL)) {
|
||||
reg |= SUN6I_LOSC_CTRL_EXT_OSC;
|
||||
if (rtc->data->has_losc_en)
|
||||
reg |= SUN6I_LOSC_CTRL_EXT_LOSC_EN;
|
||||
@@ -282,14 +283,19 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
|
||||
}
|
||||
|
||||
parents[0] = clk_hw_get_name(rtc->int_osc);
|
||||
- /* If there is no external oscillator, this will be NULL and ... */
|
||||
- parents[1] = of_clk_get_parent_name(node, 0);
|
||||
+ if (rtc->data->no_ext_losc) {
|
||||
+ parents[1] = NULL;
|
||||
+ init.num_parents = 1;
|
||||
+ } else {
|
||||
+ /* If there is no external oscillator, this will be NULL and */
|
||||
+ parents[1] = of_clk_get_parent_name(node, 0);
|
||||
+ /* ... number of clock parents will be 1. */
|
||||
+ init.num_parents = of_clk_get_parent_count(node) + 1;
|
||||
+ }
|
||||
|
||||
rtc->hw.init = &init;
|
||||
|
||||
init.parent_names = parents;
|
||||
- /* ... number of clock parents will be 1. */
|
||||
- init.num_parents = of_clk_get_parent_count(node) + 1;
|
||||
of_property_read_string_index(node, "clock-output-names", 0,
|
||||
&init.name);
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,55 @@
|
||||
From 8aa5764941546dbe3712fffb58e240c9b048ed2c Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 21 Apr 2021 12:46:43 +0100
|
||||
Subject: [PATCH 22/23] rtc: sun6i: Add Allwinner H616 support
|
||||
|
||||
The H616 RTC changes its day storage to the newly introduced linear day
|
||||
scheme, so pair the new compatible string with this feature flag.
|
||||
The clock part is missing an external 32768 Hz oscillator input pin,
|
||||
for future expansion we must thus ignore any provided clock for now.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
drivers/rtc/rtc-sun6i.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
|
||||
index 1fabb3c69041..25dae50019af 100644
|
||||
--- a/drivers/rtc/rtc-sun6i.c
|
||||
+++ b/drivers/rtc/rtc-sun6i.c
|
||||
@@ -392,6 +392,23 @@ static void __init sun50i_h6_rtc_clk_init(struct device_node *node)
|
||||
CLK_OF_DECLARE_DRIVER(sun50i_h6_rtc_clk, "allwinner,sun50i-h6-rtc",
|
||||
sun50i_h6_rtc_clk_init);
|
||||
|
||||
+static const struct sun6i_rtc_clk_data sun50i_h616_rtc_data = {
|
||||
+ .rc_osc_rate = 16000000,
|
||||
+ .fixed_prescaler = 32,
|
||||
+ .has_prescaler = 1,
|
||||
+ .has_out_clk = 1,
|
||||
+ .export_iosc = 1,
|
||||
+ .no_ext_losc = 1,
|
||||
+};
|
||||
+
|
||||
+static void __init sun50i_h616_rtc_clk_init(struct device_node *node)
|
||||
+{
|
||||
+ sun6i_rtc_clk_init(node, &sun50i_h616_rtc_data);
|
||||
+}
|
||||
+
|
||||
+CLK_OF_DECLARE_DRIVER(sun50i_h616_rtc_clk, "allwinner,sun50i-h616-rtc",
|
||||
+ sun50i_h616_rtc_clk_init);
|
||||
+
|
||||
/*
|
||||
* The R40 user manual is self-conflicting on whether the prescaler is
|
||||
* fixed or configurable. The clock diagram shows it as fixed, but there
|
||||
@@ -797,6 +814,8 @@ static const struct of_device_id sun6i_rtc_dt_ids[] = {
|
||||
{ .compatible = "allwinner,sun8i-v3-rtc" },
|
||||
{ .compatible = "allwinner,sun50i-h5-rtc" },
|
||||
{ .compatible = "allwinner,sun50i-h6-rtc" },
|
||||
+ { .compatible = "allwinner,sun50i-h616-rtc",
|
||||
+ .data = (void *)RTC_LINEAR_DAY },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -0,0 +1,93 @@
|
||||
From d62a3e6540d0f8b2ff5444ba003e2074a714c452 Mon Sep 17 00:00:00 2001
|
||||
From: Andre Przywara <andre.przywara@arm.com>
|
||||
Date: Wed, 16 Jun 2021 18:37:38 +0100
|
||||
Subject: [PATCH 23/23] arm64: dts: allwinner: h616: Add RTC and its 32K clock
|
||||
|
||||
The RTC in the new Allwinner H616 SoC has some extra "features",
|
||||
also it does not support a 32768 Hz oscillator input anymore.
|
||||
|
||||
Add the DT node describing it and change the preliminary fixed clock
|
||||
to be the actual RTC provided clock.
|
||||
|
||||
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
|
||||
---
|
||||
.../arm64/boot/dts/allwinner/sun50i-h616.dtsi | 26 ++++++++++---------
|
||||
1 file changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
index 7681f2a68dee..c55933f32d99 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h616.dtsi
|
||||
@@ -63,20 +63,13 @@ secmon_reserved: secmon@40000000 {
|
||||
};
|
||||
};
|
||||
|
||||
- osc24M: osc24M-clk {
|
||||
+ osc24M: osc24M_clk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <24000000>;
|
||||
clock-output-names = "osc24M";
|
||||
};
|
||||
|
||||
- osc32k_int: osc32k-int {
|
||||
- #clock-cells = <0>;
|
||||
- compatible = "fixed-clock";
|
||||
- clock-frequency = <32768>;
|
||||
- clock-output-names = "osc32k-int";
|
||||
- };
|
||||
-
|
||||
pmu {
|
||||
compatible = "arm,cortex-a53-pmu";
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
|
||||
@@ -129,7 +122,7 @@ sram_c: sram@28000 {
|
||||
ccu: clock@3001000 {
|
||||
compatible = "allwinner,sun50i-h616-ccu";
|
||||
reg = <0x03001000 0x1000>;
|
||||
- clocks = <&osc24M>, <&osc32k_int>, <&osc32k_int>;
|
||||
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>;
|
||||
clock-names = "hosc", "losc", "iosc";
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
@@ -155,7 +148,7 @@ pio: pinctrl@300b000 {
|
||||
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
|
||||
- clocks = <&ccu CLK_APB1>, <&osc24M>, <&osc32k_int>;
|
||||
+ clocks = <&ccu CLK_APB1>, <&osc24M>, <&rtc 0>;
|
||||
clock-names = "apb", "hosc", "losc";
|
||||
gpio-controller;
|
||||
#gpio-cells = <3>;
|
||||
@@ -654,10 +647,19 @@ ohci3: usb@5311400 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ rtc: rtc@7000000 {
|
||||
+ compatible = "allwinner,sun50i-h616-rtc";
|
||||
+ reg = <0x07000000 0x400>;
|
||||
+ interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clock-output-names = "osc32k", "osc32k-out", "iosc";
|
||||
+ #clock-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
r_ccu: clock@7010000 {
|
||||
compatible = "allwinner,sun50i-h616-r-ccu";
|
||||
reg = <0x07010000 0x210>;
|
||||
- clocks = <&osc24M>, <&osc32k_int>, <&osc32k_int>,
|
||||
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
|
||||
<&ccu CLK_PLL_PERIPH0>;
|
||||
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
||||
#clock-cells = <1>;
|
||||
@@ -668,7 +670,7 @@ r_pio: pinctrl@7022000 {
|
||||
compatible = "allwinner,sun50i-h616-r-pinctrl";
|
||||
reg = <0x07022000 0x400>;
|
||||
interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
|
||||
- clocks = <&r_ccu CLK_R_APB1>, <&osc24M>, <&osc32k_int>;
|
||||
+ clocks = <&r_ccu CLK_R_APB1>, <&osc24M>, <&rtc 0>;
|
||||
clock-names = "apb", "hosc", "losc";
|
||||
gpio-controller;
|
||||
#gpio-cells = <3>;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@ -1,24 +0,0 @@
|
||||
From 7977d7caf7136da4254b9affb6c7a96ee5f4597d Mon Sep 17 00:00:00 2001
|
||||
From: EvilOlaf <werner@armbian.de>
|
||||
Date: Sun, 6 Dec 2020 08:17:30 +0100
|
||||
Subject: [PATCH] fix broken patches from H616 series
|
||||
|
||||
Signed-off-by: EvilOlaf <werner@armbian.de>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/Makefile | 1 +
|
||||
drivers/mmc/host/sunxi-mmc.c | 2 ++
|
||||
2 files changed, 3 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
index d3eab3b57..e71c04a80 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
@@ -44,5 +44,6 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-one-plus.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-pine-h64.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-pine-h64-model-b.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-tanix-tx6.dtb
|
||||
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h616-orangepi-zero2.dtb
|
||||
|
||||
subdir-y := $(dts-dirs) overlay
|
||||
--
|
||||
Created with Armbian build tools https://github.com/armbian/build
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user