* [PATCH v8 1/4] Documentation: dt-bindings: Describe SROMc configuration
2015-11-12 13:12 [PATCH v8 0/4] Exynos SROMc configuration and Ethernet support for SMDK5410 Pavel Fedin
@ 2015-11-12 13:12 ` Pavel Fedin
2015-11-13 16:02 ` Rob Herring
2015-11-12 13:12 ` [PATCH v8 2/4] ARM: dts: Add SROMc to Exynos 5410 Pavel Fedin
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Pavel Fedin @ 2015-11-12 13:12 UTC (permalink / raw)
To: linux-arm-kernel
Add documentation for new subnode properties, allowing bank configuration.
Based on u-boot implementation, but heavily reworked.
Also, fix size of SROMc mapping in the example.
Signed-off-by: Pavel Fedin <p.fedin@samsung•com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung•com>
---
.../bindings/arm/samsung/exynos-srom.txt | 73 +++++++++++++++++++++-
1 file changed, 71 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/arm/samsung/exynos-srom.txt b/Documentation/devicetree/bindings/arm/samsung/exynos-srom.txt
index 33886d5..07c8507 100644
--- a/Documentation/devicetree/bindings/arm/samsung/exynos-srom.txt
+++ b/Documentation/devicetree/bindings/arm/samsung/exynos-srom.txt
@@ -5,8 +5,77 @@ Required properties:
- reg: offset and length of the register set
-Example:
+Optional properties:
+The SROM controller can be used to attach external peripherals. In this case
+extra properties, describing the bus behind it, should be specified as below:
+
+- #address-cells: Must be set to 2 to allow device address translation.
+ Address is specified as (bank#, offset).
+
+- #size-cells: Must be set to 1 to allow device size passing
+
+- ranges: Must be set up to reflect the memory layout with four integer values
+ per bank:
+ <bank-number> 0 <parent address of bank> <size>
+
+Sub-nodes:
+The actual device nodes should be added as subnodes to the SROMc node. These
+subnodes, except regular device specification, should contain the following
+properties, describing configuration of the relevant SROM bank:
+
+Required properties:
+- reg: bank number, base address (relative to start of the bank) and size of
+ the memory mapped for the device. Note that base address will be
+ typically 0 as this is the start of the bank.
+
+- samsung,srom-timing : array of 6 integers, specifying bank timings in the
+ following order: Tacp, Tcah, Tcoh, Tacc, Tcos, Tacs.
+ Each value is specified in cycles and has the following
+ meaning and valid range:
+ Tacp : Page mode access cycle at Page mode (0 - 15)
+ Tcah : Address holding time after CSn (0 - 15)
+ Tcoh : Chip selection hold on OEn (0 - 15)
+ Tacc : Access cycle (0 - 31, the actual time is N + 1)
+ Tcos : Chip selection set-up before OEn (0 - 15)
+ Tacs : Address set-up before CSn (0 - 15)
+
+Optional properties:
+- reg-io-width : data width in bytes (1 or 2). If omitted, default of 1 is used.
+
+- samsung,srom-page-mode : page mode configuration for the bank:
+ 0 - normal (one data)
+ 1 - four data
+ If omitted, default of 0 is used.
+
+Example: basic definition, no banks are configured
+ sromc at 12570000 {
+ compatible = "samsung,exynos-srom";
+ reg = <0x12570000 0x14>;
+ };
+
+Example: SROMc with SMSC911x ethernet chip on bank 3
sromc at 12570000 {
+ #address-cells = <2>;
+ #size-cells = <1>;
+ ranges = <0 0 0x04000000 0x20000 // Bank0
+ 1 0 0x05000000 0x20000 // Bank1
+ 2 0 0x06000000 0x20000 // Bank2
+ 3 0 0x07000000 0x20000>; // Bank3
+
compatible = "samsung,exynos-srom";
- reg = <0x12570000 0x10>;
+ reg = <0x12570000 0x14>;
+
+ ethernet at 3 {
+ compatible = "smsc,lan9115";
+ reg = <3 0 0x10000>; // Bank 3, offset = 0
+ phy-mode = "mii";
+ interrupt-parent = <&gpx0>;
+ interrupts = <5 8>;
+ reg-io-width = <2>;
+ smsc,irq-push-pull;
+ smsc,force-internal-phy;
+
+ samsung,srom-page-mode = <1>;
+ samsung,srom-timing = <9 12 1 9 1 1>;
+ };
};
--
2.4.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v8 1/4] Documentation: dt-bindings: Describe SROMc configuration
2015-11-12 13:12 ` [PATCH v8 1/4] Documentation: dt-bindings: Describe SROMc configuration Pavel Fedin
@ 2015-11-13 16:02 ` Rob Herring
0 siblings, 0 replies; 6+ messages in thread
From: Rob Herring @ 2015-11-13 16:02 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Nov 12, 2015 at 7:12 AM, Pavel Fedin <p.fedin@samsung•com> wrote:
> Add documentation for new subnode properties, allowing bank configuration.
> Based on u-boot implementation, but heavily reworked.
>
> Also, fix size of SROMc mapping in the example.
>
> Signed-off-by: Pavel Fedin <p.fedin@samsung•com>
> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung•com>
Acked-by: Rob Herring <robh@kernel•org>
One nit below.
> compatible = "samsung,exynos-srom";
> - reg = <0x12570000 0x10>;
> + reg = <0x12570000 0x14>;
> +
> + ethernet at 3 {
This should actually be "ethernet at 3,0"
Fields (not cells) in the unit address should be separated by commas.
> + compatible = "smsc,lan9115";
> + reg = <3 0 0x10000>; // Bank 3, offset = 0
> + phy-mode = "mii";
> + interrupt-parent = <&gpx0>;
> + interrupts = <5 8>;
> + reg-io-width = <2>;
> + smsc,irq-push-pull;
> + smsc,force-internal-phy;
> +
> + samsung,srom-page-mode = <1>;
> + samsung,srom-timing = <9 12 1 9 1 1>;
> + };
> };
> --
> 2.4.4
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v8 2/4] ARM: dts: Add SROMc to Exynos 5410
2015-11-12 13:12 [PATCH v8 0/4] Exynos SROMc configuration and Ethernet support for SMDK5410 Pavel Fedin
2015-11-12 13:12 ` [PATCH v8 1/4] Documentation: dt-bindings: Describe SROMc configuration Pavel Fedin
@ 2015-11-12 13:12 ` Pavel Fedin
2015-11-12 13:12 ` [PATCH v8 3/4] drivers: exynos-srom: Add support for bank configuration Pavel Fedin
2015-11-12 13:12 ` [PATCH v8 4/4] ARM: dts: Add Ethernet chip to SMDK5410 Pavel Fedin
3 siblings, 0 replies; 6+ messages in thread
From: Pavel Fedin @ 2015-11-12 13:12 UTC (permalink / raw)
To: linux-arm-kernel
This machine uses own SoC device tree file, add missing part.
Signed-off-by: Pavel Fedin <p.fedin@samsung•com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung•com>
---
arch/arm/boot/dts/exynos5410.dtsi | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/arm/boot/dts/exynos5410.dtsi b/arch/arm/boot/dts/exynos5410.dtsi
index 4603356..e2b58f8 100644
--- a/arch/arm/boot/dts/exynos5410.dtsi
+++ b/arch/arm/boot/dts/exynos5410.dtsi
@@ -101,6 +101,11 @@
reg = <0x10000000 0x100>;
};
+ sromc: sromc at 12250000 {
+ compatible = "samsung,exynos-srom";
+ reg = <0x12250000 0x14>;
+ };
+
pmu_system_controller: system-controller at 10040000 {
compatible = "samsung,exynos5410-pmu", "syscon";
reg = <0x10040000 0x5000>;
--
2.4.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v8 3/4] drivers: exynos-srom: Add support for bank configuration
2015-11-12 13:12 [PATCH v8 0/4] Exynos SROMc configuration and Ethernet support for SMDK5410 Pavel Fedin
2015-11-12 13:12 ` [PATCH v8 1/4] Documentation: dt-bindings: Describe SROMc configuration Pavel Fedin
2015-11-12 13:12 ` [PATCH v8 2/4] ARM: dts: Add SROMc to Exynos 5410 Pavel Fedin
@ 2015-11-12 13:12 ` Pavel Fedin
2015-11-12 13:12 ` [PATCH v8 4/4] ARM: dts: Add Ethernet chip to SMDK5410 Pavel Fedin
3 siblings, 0 replies; 6+ messages in thread
From: Pavel Fedin @ 2015-11-12 13:12 UTC (permalink / raw)
To: linux-arm-kernel
Implement handling properties in subnodes and adding child devices to the
system. Child devices will not be added if configuration fails.
Since the driver now does more than suspend-resume support, dependency on
CONFIG_PM is removed.
Signed-off-by: Pavel Fedin <p.fedin@samsung•com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung•com>
---
arch/arm/mach-exynos/Kconfig | 2 +-
drivers/soc/samsung/Kconfig | 2 +-
drivers/soc/samsung/exynos-srom.c | 61 +++++++++++++++++++++++++++++++++++++--
3 files changed, 61 insertions(+), 4 deletions(-)
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index 83c85f5..c22dc42 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -16,7 +16,7 @@ menuconfig ARCH_EXYNOS
select ARM_GIC
select COMMON_CLK_SAMSUNG
select EXYNOS_THERMAL
- select EXYNOS_SROM if PM
+ select EXYNOS_SROM
select HAVE_ARM_SCU if SMP
select HAVE_S3C2410_I2C if I2C
select HAVE_S3C2410_WATCHDOG if WATCHDOG
diff --git a/drivers/soc/samsung/Kconfig b/drivers/soc/samsung/Kconfig
index 2833b5b..ea4bc2a 100644
--- a/drivers/soc/samsung/Kconfig
+++ b/drivers/soc/samsung/Kconfig
@@ -8,6 +8,6 @@ config SOC_SAMSUNG
config EXYNOS_SROM
bool
- depends on ARM && ARCH_EXYNOS && PM
+ depends on ARM && ARCH_EXYNOS
endmenu
diff --git a/drivers/soc/samsung/exynos-srom.c b/drivers/soc/samsung/exynos-srom.c
index 57a232d..a4cf547 100644
--- a/drivers/soc/samsung/exynos-srom.c
+++ b/drivers/soc/samsung/exynos-srom.c
@@ -14,6 +14,7 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
+#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
@@ -67,11 +68,51 @@ static struct exynos_srom_reg_dump *exynos_srom_alloc_reg_dump(
return rd;
}
+static int exynos_srom_configure_bank(struct exynos_srom *srom,
+ struct device_node *np)
+{
+ u32 bank, width, pmc;
+ u32 timing[6];
+ u32 cs, bw;
+
+ if (of_property_read_u32(np, "reg", &bank))
+ return -EINVAL;
+ if (of_property_read_u32(np, "reg-io-width", &width))
+ width = 1;
+ if (of_property_read_u32(np, "samsung,srom-page-mode", &pmc))
+ pmc = 0;
+ if (of_property_read_u32_array(np, "samsung,srom-timing", timing,
+ ARRAY_SIZE(timing)))
+ return -EINVAL;
+
+ bank *= 4; /* Convert bank into shift/offset */
+
+ cs = 1 << EXYNOS_SROM_BW__BYTEENABLE__SHIFT;
+ if (width == 2)
+ cs |= 1 << EXYNOS_SROM_BW__DATAWIDTH__SHIFT;
+
+ bw = __raw_readl(srom->reg_base + EXYNOS_SROM_BW);
+ bw = (bw & ~(EXYNOS_SROM_BW__CS_MASK << bank)) | (cs << bank);
+ __raw_writel(bw, srom->reg_base + EXYNOS_SROM_BW);
+
+ __raw_writel((pmc << EXYNOS_SROM_BCX__PMC__SHIFT) |
+ (timing[0] << EXYNOS_SROM_BCX__TACP__SHIFT) |
+ (timing[1] << EXYNOS_SROM_BCX__TCAH__SHIFT) |
+ (timing[2] << EXYNOS_SROM_BCX__TCOH__SHIFT) |
+ (timing[3] << EXYNOS_SROM_BCX__TACC__SHIFT) |
+ (timing[4] << EXYNOS_SROM_BCX__TCOS__SHIFT) |
+ (timing[5] << EXYNOS_SROM_BCX__TACS__SHIFT),
+ srom->reg_base + EXYNOS_SROM_BC0 + bank);
+
+ return 0;
+}
+
static int exynos_srom_probe(struct platform_device *pdev)
{
- struct device_node *np;
+ struct device_node *np, *child;
struct exynos_srom *srom;
struct device *dev = &pdev->dev;
+ bool bad_bank_config = false;
np = dev->of_node;
if (!np) {
@@ -100,7 +141,23 @@ static int exynos_srom_probe(struct platform_device *pdev)
return -ENOMEM;
}
- return 0;
+ for_each_child_of_node(np, child) {
+ if (exynos_srom_configure_bank(srom, child)) {
+ dev_err(dev,
+ "Could not decode bank configuration for %s\n",
+ child->name);
+ bad_bank_config = true;
+ }
+ }
+
+ /*
+ * If any bank failed to configure, we still provide suspend/resume,
+ * but do not probe child devices
+ */
+ if (bad_bank_config)
+ return 0;
+
+ return of_platform_populate(np, NULL, NULL, dev);
}
static int exynos_srom_remove(struct platform_device *pdev)
--
2.4.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v8 4/4] ARM: dts: Add Ethernet chip to SMDK5410
2015-11-12 13:12 [PATCH v8 0/4] Exynos SROMc configuration and Ethernet support for SMDK5410 Pavel Fedin
` (2 preceding siblings ...)
2015-11-12 13:12 ` [PATCH v8 3/4] drivers: exynos-srom: Add support for bank configuration Pavel Fedin
@ 2015-11-12 13:12 ` Pavel Fedin
3 siblings, 0 replies; 6+ messages in thread
From: Pavel Fedin @ 2015-11-12 13:12 UTC (permalink / raw)
To: linux-arm-kernel
The chip is smsc9115, connected via SROMc bank 3. Additionally, some GPIO
initialization is required.
Signed-off-by: Pavel Fedin <p.fedin@samsung•com>
Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung•com>
---
arch/arm/boot/dts/exynos5410-smdk5410.dts | 41 +++++++++++++++++++++++++++++++
arch/arm/boot/dts/exynos5410.dtsi | 6 +++++
2 files changed, 47 insertions(+)
diff --git a/arch/arm/boot/dts/exynos5410-smdk5410.dts b/arch/arm/boot/dts/exynos5410-smdk5410.dts
index cebeaab..373abf7 100644
--- a/arch/arm/boot/dts/exynos5410-smdk5410.dts
+++ b/arch/arm/boot/dts/exynos5410-smdk5410.dts
@@ -11,6 +11,7 @@
/dts-v1/;
#include "exynos5410.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
/ {
model = "Samsung SMDK5410 board based on EXYNOS5410";
compatible = "samsung,smdk5410", "samsung,exynos5410", "samsung,exynos5";
@@ -61,6 +62,46 @@
disable-wp;
};
+&pinctrl_0 {
+ srom_ctl: srom-ctl {
+ samsung,pins = "gpy0-3", "gpy0-4", "gpy0-5",
+ "gpy1-0", "gpy1-1", "gpy1-2", "gpy1-3";
+ samsung,pin-function = <2>;
+ samsung,pin-drv = <0>;
+ };
+
+ srom_ebi: srom-ebi {
+ samsung,pins = "gpy3-0", "gpy3-1", "gpy3-2", "gpy3-3",
+ "gpy3-4", "gpy3-5", "gpy3-6", "gpy3-7",
+ "gpy5-0", "gpy5-1", "gpy5-2", "gpy5-3",
+ "gpy5-4", "gpy5-5", "gpy5-6", "gpy5-7",
+ "gpy6-0", "gpy6-1", "gpy6-2", "gpy6-3",
+ "gpy6-4", "gpy6-5", "gpy6-6", "gpy6-7";
+ samsung,pin-function = <2>;
+ samsung,pin-pud = <3>;
+ samsung,pin-drv = <0>;
+ };
+};
+
+&sromc {
+ pinctrl-names = "default";
+ pinctrl-0 = <&srom_ctl>, <&srom_ebi>;
+
+ ethernet at 3 {
+ compatible = "smsc,lan9115";
+ reg = <3 0 0x10000>;
+ phy-mode = "mii";
+ interrupt-parent = <&gpx0>;
+ interrupts = <5 IRQ_TYPE_LEVEL_LOW>;
+ reg-io-width = <2>;
+ smsc,irq-push-pull;
+ smsc,force-internal-phy;
+
+ samsung,srom-page-mode = <1>;
+ samsung,srom-timing = <9 12 1 9 1 1>;
+ };
+};
+
&uart0 {
status = "okay";
};
diff --git a/arch/arm/boot/dts/exynos5410.dtsi b/arch/arm/boot/dts/exynos5410.dtsi
index e2b58f8..9cfb814 100644
--- a/arch/arm/boot/dts/exynos5410.dtsi
+++ b/arch/arm/boot/dts/exynos5410.dtsi
@@ -104,6 +104,12 @@
sromc: sromc at 12250000 {
compatible = "samsung,exynos-srom";
reg = <0x12250000 0x14>;
+ #address-cells = <2>;
+ #size-cells = <1>;
+ ranges = <0 0 0x04000000 0x20000
+ 1 0 0x05000000 0x20000
+ 2 0 0x06000000 0x20000
+ 3 0 0x07000000 0x20000>;
};
pmu_system_controller: system-controller at 10040000 {
--
2.4.4
^ permalink raw reply related [flat|nested] 6+ messages in thread