ARM: sunxi: SRAM mapping support
Subsystems (5)
cover ARM: sunxi: SRAM mapping support
Hi All,
Here is a cleaned up version of Maxime's sunxi SRAM controller driver.
I've been using / testing this together with the sunxi musb support patches I've been working on, and it works well. I've tested it on sun4i, sun5i and sun7i. See the per patch commit messages for the (minor) changes which I did compared to Maxime's RFC.
A note about the changing of the compatible to a sun4i-a10 prefix, I've looked at the user manual for all 3 generations and the sram controller is the same for all 3. Register 0x1c00024 (SoC version) is only documented in the A20 manual, but is present and works indentical in all 3 generations.
Since this is a prereq for my musb work, if there are no objections then I would like to see this go upstream soon.
Since it only touches sunxi files (and one Makefile), it is probably best if this all goes upstream through Maxime.
Regards,
Hans
PATCH 1/5 drivers: soc: sunxi: Introduce SoC driver to map SRAMs
From: Maxime Ripard <[email protected]>
The Allwinner SoCs have a handful of SRAM that can be either mapped to be accessible by devices or the CPU.
That mapping is controlled by an SRAM controller, and that mapping might not be set by the bootloader, for example if the device wasn't used at all, or if we're using solutions like the U-Boot's Falcon Boot.
We could also imagine changing this at runtime for example to change the mapping of these SRAMs to use them for suspend/resume or runtime memory rate change, if that ever happens.
These use cases require some API in the kernel to control that mapping, exported through a drivers/soc driver.
This driver also implement a debugfs file that shows the SRAM found in the system, the current mapping and the SRAM that have been claimed by some drivers in the kernel.
[hdegoede at redhat.com: Changed compat string to sun4i-a10-sram-controller, as
the sram controller is identical on sun4i, sun5i & sun7i, added devicetree binding documentation, fixed some checkpatch warnings]
--- .../devicetree/bindings/soc/sunxi/sram.txt | 64 ++++++ drivers/soc/Kconfig | 1 + drivers/soc/Makefile | 1 + drivers/soc/sunxi/Kconfig | 12 ++ drivers/soc/sunxi/Makefile | 1 + drivers/soc/sunxi/sunxi_sram.c | 235 +++++++++++++++++++++ include/linux/soc/sunxi/sunxi_sram.h | 24 +++ 7 files changed, 338 insertions(+) create mode 100644 Documentation/devicetree/bindings/soc/sunxi/sram.txt create mode 100644 drivers/soc/sunxi/Kconfig create mode 100644 drivers/soc/sunxi/Makefile create mode 100644 drivers/soc/sunxi/sunxi_sram.c create mode 100644 include/linux/soc/sunxi/sunxi_sram.h
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +64 -0
@@ -0,0 +1,64 @@ +Allwinnner sun4i / sun5i / sun7i SoC SRAM controllers +----------------------------------------------------- + +Required properties: +- compatible : "allwinner,sun4i-a10-sram-controller" +- reg : sram controller register offset + length + +SRAM nodes +---------- + +Besides a node for the SRAM controller the devicetree must also contain a +node for each SRAM block controlled by the controller. + +Required sram node properties: +- compatible : "allwinner,sun4i-a10-sram" +- allwinner,sram-name : should be one of + * "A1" + * "A2" + * "A3-A4" + * "D" + +Example +------- + +/* + * Note we use the address were mmio register start, not where + * the SRAM blocks starts, this cannot be changed because doing + * doing so would be a devicetree ABI change. + */ +soc at 01c00000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; +};
drivers/soc/Kconfig +1 -0
@@ -1,6 +1,7 @@ menu "SOC (System On Chip) specific Drivers" source "drivers/soc/qcom/Kconfig" +source "drivers/soc/sunxi/Kconfig" source "drivers/soc/ti/Kconfig" source "drivers/soc/versatile/Kconfig"
drivers/soc/Makefile +1 -0
@@ -3,6 +3,7 @@ # obj-$(CONFIG_ARCH_QCOM) += qcom/ +obj-$(CONFIG_ARCH_SUNXI) += sunxi/ obj-$(CONFIG_ARCH_TEGRA) += tegra/ obj-$(CONFIG_SOC_TI) += ti/ obj-$(CONFIG_PLAT_VERSATILE) += versatile/
drivers/soc/sunxi/Kconfig new file +12 -0
@@ -0,0 +1,12 @@ +# +# Allwinner sunXi SoC drivers +# +config SUNXI_SRAM + tristate "Allwinner sunXi SRAM Controller" + depends on ARCH_SUNXI + default y + help + Say y here to enable the SRAM controller support. This + device is responsible on mapping the SRAM in the sunXi SoCs + wether to the CPU/DMA, or to the devices. +
drivers/soc/sunxi/Makefile new file +1 -0
@@ -0,0 +1 @@ +obj-$(CONFIG_SUNXI_SRAM) += sunxi_sram.o
drivers/soc/sunxi/sunxi_sram.c new file +235 -0
235 lines not on this page · raw message
include/linux/soc/sunxi/sunxi_sram.h new file +24 -0
@@ -0,0 +1,24 @@ +/* +* Allwinner SoCs SRAM Controller Driver +* +* Copyright (C) 2015 Maxime Ripard +* +* Author: Maxime Ripard <[email protected]> +* +* This file is licensed under the terms of the GNU General Public +* License version 2. This program is licensed "as is" without any +* warranty of any kind, whether express or implied. +*/ + +#ifndef _SUNXI_SRAM_H_ +#define _SUNXI_SRAM_H_ + +enum sunxi_sram_type { +SUNXI_SRAM_USB_OTG , +SUNXI_SRAM_EMAC , +}; + +int sunxi_sram_claim (enum sunxi_sram_type type,const char *function); +int sunxi_sram_release (enum sunxi_sram_type type); + +#endif /* _SUNXI_SRAM_H_ */
Signature · 1 line
2.3.3
PATCH 1/5 drivers: soc: sunxi: Introduce SoC driver to map SRAMs
Hi,
Quoted 62 lines · Hans de Goede
From: Maxime Ripard <[email protected]>
The Allwinner SoCs have a handful of SRAM that can be either mapped to be accessible by devices or the CPU.
That mapping is controlled by an SRAM controller, and that mapping might not be set by the bootloader, for example if the device wasn't used at all, or if we're using solutions like the U-Boot's Falcon Boot.
We could also imagine changing this at runtime for example to change the mapping of these SRAMs to use them for suspend/resume or runtime memory rate change, if that ever happens.
These use cases require some API in the kernel to control that mapping, exported through a
drivers/socdriver.This driver also implement a debugfs file that shows the SRAM found in the system, the current mapping and the SRAM that have been claimed by some drivers in the kernel.
Signed-off-by Maxime Ripard <[email protected]>[hdegoede at redhat.com: Changed compat string to sun4i-a10-sram-controller, as
the sram controller is identical on sun4i, sun5i & sun7i, added devicetree binding documentation, fixed some checkpatch warnings]Signed-off-by Hans de Goede <[email protected]>--- .../devicetree/bindings/soc/sunxi/sram.txt | 64 ++++++ drivers/soc/Kconfig | 1 + drivers/soc/Makefile | 1 + drivers/soc/sunxi/Kconfig | 12 ++ drivers/soc/sunxi/Makefile | 1 + drivers/soc/sunxi/sunxi_sram.c | 235 +++++++++++++++++++++ include/linux/soc/sunxi/sunxi_sram.h | 24 +++ 7 files changed, 338 insertions(+) create mode 100644 Documentation/devicetree/bindings/soc/sunxi/sram.txt create mode 100644 drivers/soc/sunxi/Kconfig create mode 100644 drivers/soc/sunxi/Makefile create mode 100644 drivers/soc/sunxi/sunxi_sram.c create mode 100644 include/linux/soc/sunxi/sunxi_sram.hDocumentation/devicetree/bindings/soc/sunxi/sram.txt new file +16
-0@@ -0,0 +1,64 @@ +Allwinnner sun4i / sun5i / sun7i SoC SRAM controllers +----------------------------------------------------- + +Required properties: +- compatible : "allwinner,sun4i-a10-sram-controller" +- reg : sram controller register offset + length + +SRAM nodes +---------- + +Besides a node for the SRAM controller the devicetree must also contain a +node for each SRAM block controlled by the controller. + +Required sram node properties: +- compatible : "allwinner,sun4i-a10-sram" +- allwinner,sram-name : should be one of
Documentation/devicetree/bindings/soc/sunxi/sram.txt line 26
Quoted 10 lines
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +10
-0+ * "A1" + * "A2" + * "A3-A4" + * "D" + +Example +------- + +/* + * Note we use the address were mmio register start, not where
^ where
Documentation/devicetree/bindings/soc/sunxi/sram.txt line 27
Quoted 1 line
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +1
-0+ * the SRAM blocks starts, this cannot be changed because doing
^ start
Documentation/devicetree/bindings/soc/sunxi/sram.txt line 28
Quoted 1 line
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +1
-0+ * doing so would be a devicetree ABI change.
One doing too many ? :)
Quoted 66 lines
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +36
-0+ */ +soc at 01c00000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; +};drivers/soc/Kconfig +1
-0@@ -1,6 +1,7 @@ menu "SOC (System On Chip) specific Drivers" source "drivers/soc/qcom/Kconfig" +source "drivers/soc/sunxi/Kconfig" source "drivers/soc/ti/Kconfig" source "drivers/soc/versatile/Kconfig"drivers/soc/Makefile +1
-0@@ -3,6 +3,7 @@ # obj-$(CONFIG_ARCH_QCOM) += qcom/ +obj-$(CONFIG_ARCH_SUNXI) += sunxi/ obj-$(CONFIG_ARCH_TEGRA) += tegra/ obj-$(CONFIG_SOC_TI) += ti/ obj-$(CONFIG_PLAT_VERSATILE) += versatile/drivers/soc/sunxi/Kconfig new file +0
-0
drivers/soc/sunxi/Kconfig line 7
Quoted 7 lines
drivers/soc/sunxi/Kconfig new file +7
-0@@ -0,0 +1,12 @@ +# +# Allwinner sunXi SoC drivers +# +config SUNXI_SRAM + tristate "Allwinner sunXi SRAM Controller" + depends on ARCH_SUNXI + default y
The indentation is off.
Also, that could probably be turned into an hidden option, with a default y, so that we are sure that it's always going to be there.
Thanks,
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150324/4891405c/attachment.sig>
PATCH 1/5 drivers: soc: sunxi: Introduce SoC driver to map SRAMs
Hi,
Quoted 77 lines · Maxime Ripard
Hi,
Quoted 62 lines · Hans de Goede
From: Maxime Ripard <[email protected]>
The Allwinner SoCs have a handful of SRAM that can be either mapped to be accessible by devices or the CPU.
That mapping is controlled by an SRAM controller, and that mapping might not be set by the bootloader, for example if the device wasn't used at all, or if we're using solutions like the U-Boot's Falcon Boot.
We could also imagine changing this at runtime for example to change the mapping of these SRAMs to use them for suspend/resume or runtime memory rate change, if that ever happens.
These use cases require some API in the kernel to control that mapping, exported through a
drivers/socdriver.This driver also implement a debugfs file that shows the SRAM found in the system, the current mapping and the SRAM that have been claimed by some drivers in the kernel.
Signed-off-by Maxime Ripard <[email protected]>[hdegoede at redhat.com: Changed compat string to sun4i-a10-sram-controller, as
the sram controller is identical on sun4i, sun5i & sun7i, added devicetree binding documentation, fixed some checkpatch warnings]Signed-off-by Hans de Goede <[email protected]>--- .../devicetree/bindings/soc/sunxi/sram.txt | 64 ++++++ drivers/soc/Kconfig | 1 + drivers/soc/Makefile | 1 + drivers/soc/sunxi/Kconfig | 12 ++ drivers/soc/sunxi/Makefile | 1 + drivers/soc/sunxi/sunxi_sram.c | 235 +++++++++++++++++++++ include/linux/soc/sunxi/sunxi_sram.h | 24 +++ 7 files changed, 338 insertions(+)create mode 100644
Documentation/devicetree/bindings/soc/sunxi/sram.txtcreate mode 100644drivers/soc/sunxi/Kconfig
create mode 100644drivers/soc/sunxi/Makefile
create mode 100644drivers/soc/sunxi/sunxi_sram.c
create mode 100644include/linux/soc/sunxi/sunxi_sram.hDocumentation/devicetree/bindings/soc/sunxi/sram.txt new file +16
-0@@ -0,0 +1,64 @@ +Allwinnner sun4i / sun5i / sun7i SoC SRAM controllers +----------------------------------------------------- + +Required properties: +- compatible : "allwinner,sun4i-a10-sram-controller" +- reg : sram controller register offset + length + +SRAM nodes +---------- + +Besides a node for the SRAM controller the devicetree must also contain a +node for each SRAM block controlled by the controller. + +Required sram node properties: +- compatible : "allwinner,sun4i-a10-sram" +- allwinner,sram-name : should be one ofDocumentation/devicetree/bindings/soc/sunxi/sram.txt line 26
Quoted 10 lines
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +10
-0+ * "A1" + * "A2" + * "A3-A4" + * "D" + +Example +------- + +/* + * Note we use the address were mmio register start, not where^ where
Quoted 6 lines
Documentation/devicetree/bindings/soc/sunxi/sram.txt line 27
Quoted 1 line
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +1
-0+ * the SRAM blocks starts, this cannot be changed because doing^ start
Documentation/devicetree/bindings/soc/sunxi/sram.txt line 28
Quoted 1 line
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +1
-0+ * doing so would be a devicetree ABI change.One doing too many ? :)
Both fixed.
Quoted 67 lines
Quoted 67 lines
Documentation/devicetree/bindings/soc/sunxi/sram.txt new file +36
-0+ */ +soc at 01c00000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; +};drivers/soc/Kconfig +1
-0@@ -1,6 +1,7 @@ menu "SOC (System On Chip) specific Drivers" source "drivers/soc/qcom/Kconfig" +source "drivers/soc/sunxi/Kconfig" source "drivers/soc/ti/Kconfig" source "drivers/soc/versatile/Kconfig"drivers/soc/Makefile +1
-0@@ -3,6 +3,7 @@ # obj-$(CONFIG_ARCH_QCOM) += qcom/ +obj-$(CONFIG_ARCH_SUNXI) += sunxi/ obj-$(CONFIG_ARCH_TEGRA) += tegra/ obj-$(CONFIG_SOC_TI) += ti/ obj-$(CONFIG_PLAT_VERSATILE) += versatile/drivers/soc/sunxi/Kconfig new file +1
-0@@ -0,0 +1,12 @@ +#
Quoted 8 lines
drivers/soc/sunxi/Kconfig line 7
Quoted 6 lines
drivers/soc/sunxi/Kconfig new file +6
-0+# Allwinner sunXi SoC drivers +# +config SUNXI_SRAM + tristate "Allwinner sunXi SRAM Controller" + depends on ARCH_SUNXI + default yThe indentation is off.
That is because your original patch used 8 spaces instead of tabs, fixed.
Quoted 2 lines
Also, that could probably be turned into an hidden option, with a default y, so that we are sure that it's always going to be there.
Also done / fixed.
Regards,
Hans
PATCH 2/5 ARM: dts: sun4i: Add A10 SRAM and SRAM controller
In reply to Hans de GoedeThe A10 has a few SRAM that can be mapped either to a device or to the CPU, with the mapping being controlled by a SRAM controller.
Since most of the time these SRAM won't be accessible by the CPU, we can't use the mmio-sram driver and compatible.
--- arch/arm/boot/dts/sun4i-a10.dtsi | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
arch/arm/boot/dts/sun4i-a10.dtsi +34 -0
@@ -451,12 +451,46 @@ }; }; + /* + * Note we use the address were mmio registers start, not where the + * SRAM blocks start, this cannot be changed because that would be + * a devicetree ABI change. + */ soc at 01c00000 { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; + dma: dma-controller at 01c02000 { compatible = "allwinner,sun4i-a10-dma"; reg = <0x01c02000 0x1000>;
Signature · 1 line
2.3.3
PATCH 2/5 ARM: dts: sun4i: Add A10 SRAM and SRAM controller
Quoted 16 lines · Hans de Goede
The A10 has a few SRAM that can be mapped either to a device or to the CPU, with the mapping being controlled by a SRAM controller.
Since most of the time these SRAM won't be accessible by the CPU, we can't use the mmio-sram driver and compatible.
Signed-off-by Hans de Goede <[email protected]>--- arch/arm/boot/dts/sun4i-a10.dtsi | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)arch/arm/boot/dts/sun4i-a10.dtsi +0
-0
arch/arm/boot/dts/sun4i-a10.dtsi line 455
Quoted 5 lines
arch/arm/boot/dts/sun4i-a10.dtsi +2
-0@@ -451,12 +451,46 @@ }; }; + /* + * Note we use the address were mmio registers start, not where the
^ where
Quoted 44 lines
arch/arm/boot/dts/sun4i-a10.dtsi +32
-0+ * SRAM blocks start, this cannot be changed because that would be + * a devicetree ABI change. + */ soc at 01c00000 { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; + dma: dma-controller at 01c02000 { compatible = "allwinner,sun4i-a10-dma"; reg = <0x01c02000 0x1000>;Signature · 1 line
2.3.3
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150324/b7687602/attachment-0001.sig>
PATCH 2/5 ARM: dts: sun4i: Add A10 SRAM and SRAM controller
Hi,
Quoted 20 lines · Maxime Ripard
Quoted 19 lines · Hans de Goede
The A10 has a few SRAM that can be mapped either to a device or to the CPU, with the mapping being controlled by a SRAM controller.
Since most of the time these SRAM won't be accessible by the CPU, we can't use the mmio-sram driver and compatible.
Signed-off-by Hans de Goede <[email protected]>--- arch/arm/boot/dts/sun4i-a10.dtsi | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)arch/arm/boot/dts/sun4i-a10.dtsi +0
-0@@ -451,12 +451,46 @@ }; };
Quoted 4 lines
arch/arm/boot/dts/sun4i-a10.dtsi line 455
Quoted 2 lines
arch/arm/boot/dts/sun4i-a10.dtsi +2
-0+ /* + * Note we use the address were mmio registers start, not where the^ where
Fixed in patches 2 to 4.
Regards,
Hans
Quoted 45 lines
Quoted 44 lines
arch/arm/boot/dts/sun4i-a10.dtsi +32
-1+ * SRAM blocks start, this cannot be changed because that would be + * a devicetree ABI change. + */ soc at 01c00000 { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; + dma: dma-controller at 01c02000 { compatible = "allwinner,sun4i-a10-dma"; reg = <0x01c02000 0x1000>; --2.3.3
PATCH 3/5 ARM: dts: sun5i: Add A13 and A10s SRAM and SRAM controller
In reply to Hans de GoedeThe A13 / A10s has a few SRAM that can be mapped either to a device or to the CPU, with the mapping being controlled by a SRAM controller.
Since most of the time these SRAM won't be accessible by the CPU, we can't use the mmio-sram driver and compatible.
--- arch/arm/boot/dts/sun5i.dtsi | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
arch/arm/boot/dts/sun5i.dtsi +34 -0
@@ -298,12 +298,46 @@ }; }; + /* + * Note we use the address were mmio registers start, not where the + * SRAM blocks start, this cannot be changed because that would be + * a devicetree ABI change. + */ soc at 01c00000 { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; + dma: dma-controller at 01c02000 { compatible = "allwinner,sun4i-a10-dma"; reg = <0x01c02000 0x1000>;
Signature · 1 line
2.3.3
PATCH 4/5 ARM: dts: sun7i: Add A20 SRAM and SRAM controller
In reply to Hans de GoedeFrom: Maxime Ripard <[email protected]>
The A20 has a few SRAM that can be mapped either to a device or to the CPU, with the mapping being controlled by a SRAM controller.
Since most of the time these SRAM won't be accessible by the CPU, we can't use the mmio-sram driver and compatible.
[hdegoede at redhat.com: Do not change soc node name, change compatible to
sun4i-a10-sram-controller to match the driver change]
--- arch/arm/boot/dts/sun7i-a20.dtsi | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
arch/arm/boot/dts/sun7i-a20.dtsi +34 -0
@@ -528,12 +528,46 @@ }; }; + /* + * Note we use the address were mmio registers start, not where the + * SRAM blocks start, this cannot be changed because that would be + * a devicetree ABI change. + */ soc at 01c00000 { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; + sram at 00000000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00000000 0x4000>; + allwinner,sram-name = "A1"; + }; + + sram at 00004000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00004000 0x4000>; + allwinner,sram-name = "A2"; + }; + + sram at 00008000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00008000 0x4000>; + allwinner,sram-name = "A3-A4"; + }; + + sram at 00010000 { + compatible = "allwinner,sun4i-a10-sram"; + reg = <0x00010000 0x1000>; + allwinner,sram-name = "D"; + }; + + sram-controller at 01c00000 { + compatible = "allwinner,sun4i-a10-sram-controller"; + reg = <0x01c00000 0x30>; + }; + nmi_intc: interrupt-controller at 01c00030 { compatible = "allwinner,sun7i-a20-sc-nmi"; interrupt-controller;
Signature · 1 line
2.3.3
PATCH 5/5 net: allwinner: emac: Claim our SRAM
In reply to Hans de GoedeFrom: Maxime Ripard <[email protected]>
The SRAM the EMAC is using might not have been mapped accordingly by the bootloader, preventing the EMAC to work properly.
Ask for that SRAM to be mapped at probe time to make sure that this never happens.
--- drivers/net/ethernet/allwinner/sun4i-emac.c | 13 +++++++++++-- drivers/net/ethernet/stmicro/stmmac/Kconfig | 1 + 2 files changed, 12 insertions(+), 2 deletions(-)
drivers/net/ethernet/allwinner/sun4i-emac.c +11 -2
@@ -29,6 +29,8 @@#include <linux/platform_device.h> #include <linux/phy.h> +#include <linux/soc/sunxi/sunxi_sram.h> +#include "sun4i-emac.h" #define DRV_NAME "sun4i-emac"
@@ -857,11 +859,15 @@ static int emac_probe(struct platform_device *pdev)clk_prepare_enable (db->clk); + ret =sunxi_sram_claim (SUNXI_SRAM_EMAC ,"emac" ); +if (ret) +dev_warn (&pdev->dev,"Couldn't map SRAM to device\n" ); + db->phy_node =of_parse_phandle (np,"phy" ,0 );if (!db->phy_node) {dev_err (&pdev->dev,"no associated PHY\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; }/* Read MAC-address from DT */
@@ -893,7 +899,7 @@ static int emac_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"Registering netdev failed!\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; } dev_info(&pdev->dev, "%s: at %p, IRQ %d MAC: %pM\n",
@@ -901,6 +907,8 @@ static int emac_probe(struct platform_device *pdev)return 0 ; +out_release_sram: +sunxi_sram_release (SUNXI_SRAM_EMAC ); out:dev_err (db->dev,"not found (%d).\n" , ret);
@@ -914,6 +922,7 @@ static int emac_remove(struct platform_device *pdev)struct net_device *ndev =platform_get_drvdata (pdev);unregister_netdev (ndev); +sunxi_sram_release (SUNXI_SRAM_EMAC );free_netdev (ndev);dev_dbg (&pdev->dev,"released and freed device\n" );
drivers/net/ethernet/stmicro/stmmac/Kconfig +1 -0
@@ -16,6 +16,7 @@ if STMMAC_ETH config STMMAC_PLATFORM tristate "STMMAC Platform bus support" depends on STMMAC_ETH + select SUNXI_SRAM if ARCH_SUNXI default y ---help--- This selects the platform specific bus support for the stmmac driver.
Signature · 1 line
2.3.3
PATCH 5/5 net: allwinner: emac: Claim our SRAM
Hi,
Quoted 11 lines · Hans de Goede
From: Maxime Ripard <[email protected]>
The SRAM the EMAC is using might not have been mapped accordingly by the bootloader, preventing the EMAC to work properly.
Ask for that SRAM to be mapped at probe time to make sure that this never happens.
Signed-off-by Maxime Ripard <[email protected]>[hdegoede at redhat.com: Make sure SUNXI_SRAM gets enabled in Kconfig]Signed-off-by Hans de Goede <[email protected]>
Note this patch is only included for completeness / as an example, it should probably go upstream through the network-drivers tree once the rest is merged.
Regards,
Hans
Quoted 74 lines
--- drivers/net/ethernet/allwinner/sun4i-emac.c | 13 +++++++++++-- drivers/net/ethernet/stmicro/stmmac/Kconfig | 1 + 2 files changed, 12 insertions(+), 2 deletions(-)drivers/net/ethernet/allwinner/sun4i-emac.c +11
-2@@ -29,6 +29,8 @@#include <linux/platform_device.h> #include <linux/phy.h> +#include <linux/soc/sunxi/sunxi_sram.h> +#include "sun4i-emac.h" #define DRV_NAME "sun4i-emac"@@ -857,11 +859,15 @@ static int emac_probe(struct platform_device *pdev)clk_prepare_enable (db->clk); + ret =sunxi_sram_claim (SUNXI_SRAM_EMAC ,"emac" ); +if (ret) +dev_warn (&pdev->dev,"Couldn't map SRAM to device\n" ); + db->phy_node =of_parse_phandle (np,"phy" ,0 );if (!db->phy_node) {dev_err (&pdev->dev,"no associated PHY\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; }/* Read MAC-address from DT */ @@ -893,7 +899,7 @@ static int emac_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"Registering netdev failed!\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; } dev_info(&pdev->dev, "%s: at %p, IRQ %d MAC: %pM\n",@@ -901,6 +907,8 @@ static int emac_probe(struct platform_device *pdev)return 0 ; +out_release_sram: +sunxi_sram_release (SUNXI_SRAM_EMAC ); out:dev_err (db->dev,"not found (%d).\n" , ret);@@ -914,6 +922,7 @@ static int emac_remove(struct platform_device *pdev)struct net_device *ndev =platform_get_drvdata (pdev);unregister_netdev (ndev); +sunxi_sram_release (SUNXI_SRAM_EMAC );free_netdev (ndev);dev_dbg (&pdev->dev,"released and freed device\n" );drivers/net/ethernet/stmicro/stmmac/Kconfig +1
-0@@ -16,6 +16,7 @@ if STMMAC_ETH config STMMAC_PLATFORM tristate "STMMAC Platform bus support" depends on STMMAC_ETH + select SUNXI_SRAM if ARCH_SUNXI default y ---help--- This selects the platform specific bus support for the stmmac driver.
PATCH 5/5 net: allwinner: emac: Claim our SRAM
In reply to Hans de GoedeQuoted 77 lines · Hans de Goede
From: Maxime Ripard <[email protected]>
The SRAM the EMAC is using might not have been mapped accordingly by the bootloader, preventing the EMAC to work properly.
Ask for that SRAM to be mapped at probe time to make sure that this never happens.
Signed-off-by Maxime Ripard <[email protected]>[hdegoede at redhat.com: Make sure SUNXI_SRAM gets enabled in Kconfig]Signed-off-by Hans de Goede <[email protected]>--- drivers/net/ethernet/allwinner/sun4i-emac.c | 13 +++++++++++-- drivers/net/ethernet/stmicro/stmmac/Kconfig | 1 + 2 files changed, 12 insertions(+), 2 deletions(-)drivers/net/ethernet/allwinner/sun4i-emac.c +11
-2@@ -29,6 +29,8 @@#include <linux/platform_device.h> #include <linux/phy.h> +#include <linux/soc/sunxi/sunxi_sram.h> +#include "sun4i-emac.h" #define DRV_NAME "sun4i-emac"@@ -857,11 +859,15 @@ static int emac_probe(struct platform_device *pdev)clk_prepare_enable (db->clk); + ret =sunxi_sram_claim (SUNXI_SRAM_EMAC ,"emac" ); +if (ret) +dev_warn (&pdev->dev,"Couldn't map SRAM to device\n" ); + db->phy_node =of_parse_phandle (np,"phy" ,0 );if (!db->phy_node) {dev_err (&pdev->dev,"no associated PHY\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; }/* Read MAC-address from DT */ @@ -893,7 +899,7 @@ static int emac_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"Registering netdev failed!\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; } dev_info(&pdev->dev, "%s: at %p, IRQ %d MAC: %pM\n",@@ -901,6 +907,8 @@ static int emac_probe(struct platform_device *pdev)return 0 ; +out_release_sram: +sunxi_sram_release (SUNXI_SRAM_EMAC ); out:dev_err (db->dev,"not found (%d).\n" , ret);@@ -914,6 +922,7 @@ static int emac_remove(struct platform_device *pdev)struct net_device *ndev =platform_get_drvdata (pdev);unregister_netdev (ndev); +sunxi_sram_release (SUNXI_SRAM_EMAC );free_netdev (ndev);dev_dbg (&pdev->dev,"released and freed device\n" );drivers/net/ethernet/stmicro/stmmac/Kconfig +0
-0
drivers/net/ethernet/stmicro/stmmac/Kconfig if STMMAC_ETH · line 22
Quoted 7 lines
drivers/net/ethernet/stmicro/stmmac/Kconfig +1
-0@@ -16,6 +16,7 @@ if STMMAC_ETH config STMMAC_PLATFORM tristate "STMMAC Platform bus support" depends on STMMAC_ETH + select SUNXI_SRAM if ARCH_SUNXI default y ---help--- This selects the platform specific bus support for the stmmac driver.
Shouldn't that be in emac's Kconfig option instead?
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150324/690d9728/attachment.sig>
PATCH 5/5 net: allwinner: emac: Claim our SRAM
Hi,
Quoted 72 lines · Maxime Ripard
Quoted 71 lines · Hans de Goede
From: Maxime Ripard <[email protected]>
The SRAM the EMAC is using might not have been mapped accordingly by the bootloader, preventing the EMAC to work properly.
Ask for that SRAM to be mapped at probe time to make sure that this never happens.
Signed-off-by Maxime Ripard <[email protected]>[hdegoede at redhat.com: Make sure SUNXI_SRAM gets enabled in Kconfig]Signed-off-by Hans de Goede <[email protected]>--- drivers/net/ethernet/allwinner/sun4i-emac.c | 13 +++++++++++-- drivers/net/ethernet/stmicro/stmmac/Kconfig | 1 + 2 files changed, 12 insertions(+), 2 deletions(-)drivers/net/ethernet/allwinner/sun4i-emac.c +11
-2@@ -29,6 +29,8 @@#include <linux/platform_device.h> #include <linux/phy.h> +#include <linux/soc/sunxi/sunxi_sram.h> +#include "sun4i-emac.h" #define DRV_NAME "sun4i-emac"@@ -857,11 +859,15 @@ static int emac_probe(struct platform_device *pdev)clk_prepare_enable (db->clk); + ret =sunxi_sram_claim (SUNXI_SRAM_EMAC ,"emac" ); +if (ret) +dev_warn (&pdev->dev,"Couldn't map SRAM to device\n" ); + db->phy_node =of_parse_phandle (np,"phy" ,0 );if (!db->phy_node) {dev_err (&pdev->dev,"no associated PHY\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; }/* Read MAC-address from DT */ @@ -893,7 +899,7 @@ static int emac_probe(struct platform_device *pdev)if (ret) {dev_err (&pdev->dev,"Registering netdev failed!\n" ); ret = -ENODEV ; - goto out; + goto out_release_sram; } dev_info(&pdev->dev, "%s: at %p, IRQ %d MAC: %pM\n",@@ -901,6 +907,8 @@ static int emac_probe(struct platform_device *pdev)return 0 ; +out_release_sram: +sunxi_sram_release (SUNXI_SRAM_EMAC ); out:dev_err (db->dev,"not found (%d).\n" , ret);@@ -914,6 +922,7 @@ static int emac_remove(struct platform_device *pdev)struct net_device *ndev =platform_get_drvdata (pdev);unregister_netdev (ndev); +sunxi_sram_release (SUNXI_SRAM_EMAC );free_netdev (ndev);
Quoted 15 lines
drivers/net/ethernet/stmicro/stmmac/Kconfig if STMMAC_ETH · line 22
Quoted 13 lines
drivers/net/ethernet/allwinner/sun4i-emac.c +0
-0dev_dbg (&pdev->dev,"released and freed device\n" );drivers/net/ethernet/stmicro/stmmac/Kconfig +1
-0@@ -16,6 +16,7 @@ if STMMAC_ETH config STMMAC_PLATFORM tristate "STMMAC Platform bus support" depends on STMMAC_ETH + select SUNXI_SRAM if ARCH_SUNXI default y ---help--- This selects the platform specific bus support for the stmmac driver.Shouldn't that be in emac's
Kconfigoption instead?
Erm, yes my bad, or rather now that we've made SUNXI_SRAM a hidden option defaulting to y, it can simply be dropped. I've done that for v2 of the set which I'm about to send.
Regards,
Hans