Update ti-sysc driver to use dts for capabilities
Subsystems (6)
Tony Lindgren
maintainercover Update ti-sysc driver to use dts for capabilities
Hi all,
Here are patches for review to update ti-sysc binding and driver to get interconnect target module capabilities from device tree.
After this series I'll be posting another series to dynamically allocate struct omap_hwmod_class_sysconfig based on device tree data instead of the current platform data.
These patches are against v4.15-rc series with the last patch depending on the clkctrl nodes in Linux next.
Regards,
Tony
Tony Lindgren (9):
dt-bindings: ti-sysc: Update binding for timers and capabilities
ARM: dts: Add generic ti,sysc compatible in addition to the custom
ones
ARM: OMAP2+: Move all omap_hwmod_sysc_fields to
omap_hwmod_common_data.c
bus: ti-sysc: Make omap_hwmod_sysc_fields into sysc_regbits platform
data
bus: ti-sysc: Add register bits for interconnect target modules
bus: ti-sysc: Detect i2c interconnect target module based on register
layout
bus: ti-sysc: Handle module quirks based dts configuration
bus: ti-sysc: Add parsing of module capabilities
ARM: dts: Update ti-sysc data for existing users
Documentation/devicetree/bindings/bus/ti-sysc.txt | 37 ++ arch/arm/boot/dts/dra7.dtsi | 30 +- arch/arm/boot/dts/omap4.dtsi | 94 ++++- arch/arm/mach-omap2/omap_hwmod.c | 2 + arch/arm/mach-omap2/omap_hwmod.h | 34 +- arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 21 - arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 17 +- arch/arm/mach-omap2/omap_hwmod_7xx_data.c | 7 +- arch/arm/mach-omap2/omap_hwmod_common_data.c | 40 +- drivers/bus/ti-sysc.c | 485 ++++++++++++++++++++-- include/dt-bindings/bus/ti-sysc.h | 22 + include/linux/platform_data/ti-sysc.h | 86 ++++ 12 files changed, 758 insertions(+), 117 deletions(-) create mode 100644 include/dt-bindings/bus/ti-sysc.h create mode 100644 include/linux/platform_data/ti-sysc.h
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 1/9 dt-bindings: ti-sysc: Update binding for timers and capabilities
The ti-sysc binding does not yet describe the capabilities of the interconnect target module. So to make the ti-sysc binding usable for configuring the interconnect target module, we need to add few more properties:
1. To detect between omap2 and omap4 timers, let's add compatibles for them for "ti,sysc-omap2-timer" and,sysc-omap4-timer". This makes it easier to pick up the already initialized system timers later on
2. Let's add "ti,sysc-mask" for a mask of features supported by the interconnect target module. This describes what we have available in the various SYSCONFIG registers
3. Let's add "ti,sysc-midle" and "ti,sysc-sidle" lists for the master and slave idle modes supported by the interconnect target module. These describe the values available for MIDLE and SIDLE bits in the SYSCONFIG registers
4. Some interconnect target modules need a short delay after reset before they can be accessed, let's use "ti,sysc-delay-us" for that
5. Let's add "ti,syss-mask" bit to describe the optional SYSSTATUS register bits for reset done bits
6. Let's support the two existing custom quirk properties already listed in Documentation/devicetree/bindings/arm/omap/omap.txt for "ti,no-reset-on-init" and "ti,no-idle-on-init"
7. And finally, let's add a header for the binding for the dts files and the driver to use
--- Documentation/devicetree/bindings/bus/ti-sysc.txt | 36 +++++++++++++++++++++++ include/dt-bindings/bus/ti-sysc.h | 22 ++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 include/dt-bindings/bus/ti-sysc.h
Documentation/devicetree/bindings/bus/ti-sysc.txt +36 -0
@@ -26,6 +26,8 @@ Required standard properties: or one of the following derivative types for hardware needing special workarounds: + "ti,sysc-omap2-timer" + "ti,sysc-omap4-timer" "ti,sysc-omap3430-sr" "ti,sysc-omap3630-sr" "ti,sysc-omap4-sr"
@@ -49,6 +51,26 @@ Required standard properties: Optional properties: +- ti,sysc-mask shall contain mask of supported register bits for the + SYSCONFIG register as documented in the Technical Reference + Manual (TRM) for the interconnect target module + +- ti,sysc-midle list of master idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register MIDLEMODE bits + +- ti,sysc-sidle list of slave idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register SIDLEMODE bits + +- ti,sysc-delay-us delay needed after OCP softreset before accssing + SYSCONFIG register again + +- ti,syss-mask optional mask of reset done status bits as described in the + TRM for SYSSTATUS registers, typically 1 with some devices + having separate reset done bits for children like OHCI and + EHCI + - clocks clock specifier for each name in the clock-names as specified in the binding documentation for ti-clkctrl, typically available for all interconnect targets on TI SoCs
@@ -61,6 +83,9 @@ Optional properties: - ti,hwmods optional TI interconnect module name to use legacy hwmod platform data +- ti,no-reset-on-init interconnect target module should not be reset at init + +- ti,no-idle-on-init interconnect target module should not be idled at init Example: Single instance of MUSB controller on omap4 using interconnect ranges using offsets from l4_cfg second segment (0x4a000000 + 0x80000 = 0x4a0ab000):
@@ -74,6 +99,17 @@ using offsets from l4_cfg second segment (0x4a000000 + 0x80000 = 0x4a0ab000): reg-names = "rev", "sysc", "syss"; clocks = <&l3_init_clkctrl OMAP4_USB_OTG_HS_CLKCTRL 0>; clock-names = "fck"; + ti,sysc-mask = <(SYSC_OMAP2_ENAWAKEUP | + SYSC_OMAP2_SOFTRESET | + SYSC_OMAP2_AUTOIDLE)>; + ti,sysc-midle = <SYSC_IDLE_FORCE>, + <SYSC_IDLE_NO>, + <SYSC_IDLE_SMART>; + ti,sysc-sidle = <SYSC_IDLE_FORCE>, + <SYSC_IDLE_NO>, + <SYSC_IDLE_SMART>, + <SYSC_IDLE_SMART_WKUP>; + ti,syss-mask = <1>; #address-cells = <1>; #size-cells = <1>; ranges = <0 0x2b000 0x1000>;
include/dt-bindings/bus/ti-sysc.h new file +22 -0
@@ -0,0 +1,22 @@ +/* TI sysc interconnect target module defines */ + +/* Generic sysc found on omap2 and later, also known as type1 */ +#define SYSC_OMAP2_CLOCKACTIVITY (3 << 8) +#define SYSC_OMAP2_EMUFREE (1 << 5) +#define SYSC_OMAP2_ENAWAKEUP (1 << 2) +#define SYSC_OMAP2_SOFTRESET (1 << 1) +#define SYSC_OMAP2_AUTOIDLE (1 << 0) + +/* Generic sysc found on omap4 and later, also known as type2 */ +#define SYSC_OMAP4_DMADISABLE (1 << 16) +#define SYSC_OMAP4_FREEEMU (1 << 1)/* Also known as EMUFREE */ +#define SYSC_OMAP4_SOFTRESET (1 << 0) + +/* SmartReflex sysc found on 36xx and later */ +#define SYSC_OMAP3_SR_ENAWAKEUP (1 << 26) + +/* SYSCONFIG STANDBYMODE/MIDLEMODE/SIDLEMODE supported by hardware */ +#define SYSC_IDLE_FORCE 0 +#define SYSC_IDLE_NO 1 +#define SYSC_IDLE_SMART 2 +#define SYSC_IDLE_SMART_WKUP 3
Signature · 1 line
2.15.0
Rob Herring
maintainerRe: [PATCH 1/9] dt-bindings: ti-sysc: Update binding for timers and capabilities
Quoted 81 lines · Tony Lindgren
The ti-sysc binding does not yet describe the capabilities of the interconnect target module. So to make the ti-sysc binding usable for configuring the interconnect target module, we need to add few more properties:
1. To detect between omap2 and omap4 timers, let's add compatibles for them for "ti,sysc-omap2-timer" and,sysc-omap4-timer". This makes it easier to pick up the already initialized system timers later on
2. Let's add "ti,sysc-mask" for a mask of features supported by the interconnect target module. This describes what we have available in the various SYSCONFIG registers
3. Let's add "ti,sysc-midle" and "ti,sysc-sidle" lists for the master and slave idle modes supported by the interconnect target module. These describe the values available for MIDLE and SIDLE bits in the SYSCONFIG registers
4. Some interconnect target modules need a short delay after reset before they can be accessed, let's use "ti,sysc-delay-us" for that
5. Let's add "ti,syss-mask" bit to describe the optional SYSSTATUS register bits for reset done bits
6. Let's support the two existing custom quirk properties already listed in
Documentation/devicetree/bindings/arm/omap/omap.txtfor "ti,no-reset-on-init" and "ti,no-idle-on-init"7. And finally, let's add a header for the binding for the dts files and the driver to use
Cc Beno?t Cousson <[email protected]>Cc Dave Gerlach <[email protected]>Cc Laurent Pinchart <[email protected]>Cc Liam Girdwood <[email protected]>Cc Mark Brown <[email protected]>Cc Mark Rutland <[email protected]>Cc Mauro Carvalho Chehab <[email protected]>Cc Nishanth Menon <[email protected]>Cc Matthijs van Duin <[email protected]>Cc Paul Walmsley <[email protected]>Cc Peter Ujfalusi <[email protected]>Cc Sakari Ailus <[email protected]>Cc Suman Anna <[email protected]>Cc Tero Kristo <[email protected]>Cc Tomi Valkeinen <[email protected]>Signed-off-by Tony Lindgren <[email protected]>--- Documentation/devicetree/bindings/bus/ti-sysc.txt | 36 +++++++++++++++++++++++ include/dt-bindings/bus/ti-sysc.h | 22 ++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 include/dt-bindings/bus/ti-sysc.hDocumentation/devicetree/bindings/bus/ti-sysc.txt +12
-0@@ -26,6 +26,8 @@ Required standard properties: or one of the following derivative types for hardware needing special workarounds: + "ti,sysc-omap2-timer" + "ti,sysc-omap4-timer" "ti,sysc-omap3430-sr" "ti,sysc-omap3630-sr" "ti,sysc-omap4-sr"@@ -49,6 +51,26 @@ Required standard properties: Optional properties: +- ti,sysc-mask shall contain mask of supported register bits for the + SYSCONFIG register as documented in the Technical Reference + Manual (TRM) for the interconnect target module + +- ti,sysc-midle list of master idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register MIDLEMODE bits + +- ti,sysc-sidle list of slave idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG
Documentation/devicetree/bindings/bus/ti-sysc.txt Required standard properties: · line 73
Quoted 10 lines
Documentation/devicetree/bindings/bus/ti-sysc.txt +10
-0+ register SIDLEMODE bits + +- ti,sysc-delay-us delay needed after OCP softreset before accssing + SYSCONFIG register again + +- ti,syss-mask optional mask of reset done status bits as described in the + TRM for SYSSTATUS registers, typically 1 with some devices + having separate reset done bits for children like OHCI and + EHCI +
Seems like a lot of this should be implied by specific compatible strings.
Are the bits you've defined all of them or there's more?
Rob
Tony Lindgren
maintainerRe: [PATCH 1/9] dt-bindings: ti-sysc: Update binding for timers and capabilities
Quoted 17 lines · Rob Herring
Quoted 17 lines
Optional properties:
+- ti,sysc-mask shall contain mask of supported register bits for the
Documentation/devicetree/bindings/bus/ti-sysc.txt +14
-0+ SYSCONFIG register as documented in the Technical Reference + Manual (TRM) for the interconnect target module + +- ti,sysc-midle list of master idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register MIDLEMODE bits + +- ti,sysc-sidle list of slave idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register SIDLEMODE bits + +- ti,sysc-delay-us delay needed after OCP softreset before accssing + SYSCONFIG register again +
Quoted 8 lines
Documentation/devicetree/bindings/bus/ti-sysc.txt Required standard properties: · line 73
Quoted 5 lines
+- ti,syss-mask optional mask of reset done status bits as described in the
Documentation/devicetree/bindings/bus/ti-sysc.txt +4
-0+ TRM for SYSSTATUS registers, typically 1 with some devices + having separate reset done bits for children like OHCI and + EHCI +Seems like a lot of this should be implied by specific compatible strings.
Unfortunately that would still explode the permutations to almost one compatible per module especially for types "ti,sysc-omap2" and "ti,sysc-omap4". And the features and idle modes supported by the module are all over the place for "ti,sysc-mask", "ti,sysc-midle", "ti,sysc-sidle" and "ti,syss-mask"..
I was planning to have "ti,sysc-delay-us" only in the driver, but the same IP needs it set on dm814x while not on omap4 for OTG for example. I could add SoC specific quirks to the driver for that one if you prefer that instead?
I do have a patch also I'm testing to use the revision register value for handling further quirks, but unfortunately that register is not populated or updated for many modules. And it's only usable after the module is already configured to accessible :)
Quoted 1 line
Are the bits you've defined all of them or there's more?
That's it, with this binding I've allocated the data from dts for the tests I've done. So that should allow us to replace the static data to start with as seen with the following command:
$ git grep -A10 "struct omap_hwmod_class_sysconfig" \ arch/arm/*hwmod*data*.c ...
So that's to configure a big pile of different module configurations we currently have as can be seen with:
$ git grep "struct omap_hwmod_class_sysconfig" \ arch/arm/*hwmod*data*.c | wc -l 194
I'm sure there's still few duplicates there though..
The only pending binding change I'm aware of is the optional extra clocks, but that still pending and just uses the standard clock binding.
Regards,
Tony
Re: [PATCH 1/9] dt-bindings: ti-sysc: Update binding for timers and capabilities
Quoted 27 lines · Tony Lindgren
Quoted 17 lines · Rob Herring
Quoted 17 lines
Optional properties:
+- ti,sysc-mask shall contain mask of supported register bits for the
Documentation/devicetree/bindings/bus/ti-sysc.txt +14
-0+ SYSCONFIG register as documented in the Technical Reference + Manual (TRM) for the interconnect target module + +- ti,sysc-midle list of master idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register MIDLEMODE bits + +- ti,sysc-sidle list of slave idle modes supported by the interconnect + target module as documented in the TRM for SYSCONFIG + register SIDLEMODE bits + +- ti,sysc-delay-us delay needed after OCP softreset before accssing + SYSCONFIG register again +Quoted 8 lines
Documentation/devicetree/bindings/bus/ti-sysc.txt Required standard properties: · line 73
Quoted 5 lines
+- ti,syss-mask optional mask of reset done status bits as described in the
Documentation/devicetree/bindings/bus/ti-sysc.txt +4
-0+ TRM for SYSSTATUS registers, typically 1 with some devices + having separate reset done bits for children like OHCI and + EHCI +Seems like a lot of this should be implied by specific compatible strings.
Quoted 5 lines
Unfortunately that would still explode the permutations to almost one compatible per module especially for types "ti,sysc-omap2" and "ti,sysc-omap4". And the features and idle modes supported by the module are all over the place for "ti,sysc-mask", "ti,sysc-midle", "ti,sysc-sidle" and "ti,syss-mask"..
Okay.
Quoted 4 lines
I was planning to have "ti,sysc-delay-us" only in the driver, but the same IP needs it set on dm814x while not on omap4 for OTG for example. I could add SoC specific quirks to the driver for that one if you prefer that instead?
No, I don't have a preference.
Quoted 15 lines
I do have a patch also I'm testing to use the revision register value for handling further quirks, but unfortunately that register is not populated or updated for many modules. And it's only usable after the module is already configured to accessible :)
Quoted 1 line
Are the bits you've defined all of them or there's more?
That's it, with this binding I've allocated the data from dts for the tests I've done. So that should allow us to replace the static data to start with as seen with the following command:
$ git grep -A10 "struct omap_hwmod_class_sysconfig" \ arch/arm/*hwmod*data*.c ...
Quoted 8 lines
So that's to configure a big pile of different module configurations we currently have as can be seen with:
$ git grep "struct omap_hwmod_class_sysconfig" \ arch/arm/*hwmod*data*.c | wc -l 194I'm sure there's still few duplicates there though..
Okay, then I guess I'm okay with this.
Tony Lindgren
maintainerRe: [PATCH 1/9] dt-bindings: ti-sysc: Update binding for timers and capabilities
Quoted 7 lines · Rob Herring
Quoted 4 lines · Tony Lindgren
I was planning to have "ti,sysc-delay-us" only in the driver, but the same IP needs it set on dm814x while not on omap4 for OTG for example. I could add SoC specific quirks to the driver for that one if you prefer that instead?
No, I don't have a preference.
OK
Quoted 17 lines
Quoted 17 lines
Quoted 1 line
Are the bits you've defined all of them or there's more?
That's it, with this binding I've allocated the data from dts for the tests I've done. So that should allow us to replace the static data to start with as seen with the following command:
$ git grep -A10 "struct omap_hwmod_class_sysconfig" \ arch/arm/*hwmod*data*.c ...So that's to configure a big pile of different module configurations we currently have as can be seen with:
$ git grep "struct omap_hwmod_class_sysconfig" \ arch/arm/*hwmod*data*.c | wc -l 194
Quoted 5 lines
Quoted 1 line
I'm sure there's still few duplicates there though..
Okay, then I guess I'm okay with this.
Reviewed-by Rob Herring <[email protected]>
OK thanks for the review.
Regards,
Tony
Tony Lindgren
maintainerPATCH 2/9 ARM: dts: Add generic ti,sysc compatible in addition to the custom ones
In reply to Tony LindgrenOtherwise we cannot use generic OF_DEV_AUXDATA match without listing all the compatibles separately for OF_DEV_AUXDATA. Let's also update the binding accordingly.
Let's also fix omap4.dtsi to use "ti,sysc-omap4-sr" compatible as we have documented in the binding. This was not noticed earlier as we're still probing SmartReflex driver with platform data.
--- Documentation/devicetree/bindings/bus/ti-sysc.txt | 1 + arch/arm/boot/dts/dra7.dtsi | 4 ++-- arch/arm/boot/dts/omap4.dtsi | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-)
Documentation/devicetree/bindings/bus/ti-sysc.txt +1 -0
@@ -19,6 +19,7 @@ Required standard properties: - compatible shall be one of the following generic types: + "ti,sysc" "ti,sysc-omap2" "ti,sysc-omap4" "ti,sysc-omap4-simple"
arch/arm/boot/dts/dra7.dtsi +2 -2
@@ -1498,7 +1498,7 @@ }; target-module at 4a0dd000 { - compatible = "ti,sysc-omap4-sr"; + compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_core"; reg = <0x4a0dd000 0x4>, <0x4a0dd008 0x4>;
@@ -1511,7 +1511,7 @@ }; target-module at 4a0d9000 { - compatible = "ti,sysc-omap4-sr"; + compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_mpu"; reg = <0x4a0d9000 0x4>, <0x4a0d9008 0x4>;
arch/arm/boot/dts/omap4.dtsi +10 -10
@@ -383,7 +383,7 @@ }; target-module at 48076000 { - compatible = "ti,sysc-omap4"; + compatible = "ti,sysc-omap4", "ti,sysc"; ti,hwmods = "slimbus2"; reg = <0x48076000 0x4>, <0x48076010 0x4>;
@@ -456,7 +456,7 @@ }; target-module at 4a0db000 { - compatible = "ti,sysc-sr"; + compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_iva"; reg = <0x4a0db000 0x4>, <0x4a0db008 0x4>;
@@ -473,7 +473,7 @@ }; target-module at 4a0dd000 { - compatible = "ti,sysc-sr"; + compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_core"; reg = <0x4a0dd000 0x4>, <0x4a0dd008 0x4>;
@@ -490,7 +490,7 @@ }; target-module at 4a0d9000 { - compatible = "ti,sysc-sr"; + compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_mpu"; reg = <0x4a0d9000 0x4>, <0x4a0d9008 0x4>;
@@ -710,7 +710,7 @@ }; target-module at 52000000 { - compatible = "ti,sysc-omap4"; + compatible = "ti,sysc-omap4", "ti,sysc"; ti,hwmods = "iss"; reg = <0x52000000 0x4>, <0x52000010 0x4>;
@@ -817,7 +817,7 @@ }; target-module at 40128000 { - compatible = "ti,sysc-mcasp"; + compatible = "ti,sysc-mcasp", "ti,sysc"; ti,hwmods = "mcasp"; reg = <0x40128004 0x4>; reg-names = "sysc";
@@ -835,7 +835,7 @@ }; target-module at 4012c000 { - compatible = "ti,sysc-omap4"; + compatible = "ti,sysc-omap4", "ti,sysc"; ti,hwmods = "slimbus1"; reg = <0x4012c000 0x4>, <0x4012c010 0x4>;
@@ -849,7 +849,7 @@ }; target-module at 401f1000 { - compatible = "ti,sysc-omap4"; + compatible = "ti,sysc-omap4", "ti,sysc"; ti,hwmods = "aess"; reg = <0x401f1000 0x4>, <0x401f1010 0x4>;
@@ -955,7 +955,7 @@ }; target-module at 4a10a000 { - compatible = "ti,sysc-omap4"; + compatible = "ti,sysc-omap4", "ti,sysc"; ti,hwmods = "fdif"; reg = <0x4a10a000 0x4>, <0x4a10a010 0x4>;
@@ -1183,7 +1183,7 @@ }; target-module at 56000000 { - compatible = "ti,sysc-omap4"; + compatible = "ti,sysc-omap4", "ti,sysc"; ti,hwmods = "gpu"; reg = <0x5601fc00 0x4>, <0x5601fc10 0x4>;
Signature · 1 line
2.15.0
Re: [PATCH 2/9] ARM: dts: Add generic ti, sysc compatible in addition to the custom ones
Quoted 3 lines · Tony Lindgren
Otherwise we cannot use generic
OF_DEV_AUXDATAmatch without listing all the compatibles separately forOF_DEV_AUXDATA. Let's also update the binding accordingly.
Your subject has a space in "ti,sysc".
Quoted 10 lines
Let's also fix
omap4.dtsito use "ti,sysc-omap4-sr" compatible as we have documented in the binding. This was not noticed earlier as we're still probing SmartReflex driver with platform data.Signed-off-by Tony Lindgren <[email protected]>--- Documentation/devicetree/bindings/bus/ti-sysc.txt | 1 + arch/arm/boot/dts/dra7.dtsi | 4 ++-- arch/arm/boot/dts/omap4.dtsi | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-)
Otherwise,
Tony Lindgren
maintainerRe: [PATCH 2/9] ARM: dts: Add generic ti, sysc compatible in addition to the custom ones
Quoted 6 lines · Rob Herring
Quoted 3 lines · Tony Lindgren
Otherwise we cannot use generic
OF_DEV_AUXDATAmatch without listing all the compatibles separately forOF_DEV_AUXDATA. Let's also update the binding accordingly.Your subject has a space in "ti,sysc".
Oops thanks for noticing, will fix.
Quoted 11 lines
Quoted 10 lines
Let's also fix
omap4.dtsito use "ti,sysc-omap4-sr" compatible as we have documented in the binding. This was not noticed earlier as we're still probing SmartReflex driver with platform data.Signed-off-by Tony Lindgren <[email protected]>--- Documentation/devicetree/bindings/bus/ti-sysc.txt | 1 + arch/arm/boot/dts/dra7.dtsi | 4 ++-- arch/arm/boot/dts/omap4.dtsi | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-)
Quoted 3 lines
Otherwise,
Reviewed-by Rob Herring <[email protected]>
Thanks for looking,
Tony
Tony Lindgren
maintainerPATCH 3/9 ARM: OMAP2+: Move all omap_hwmod_sysc_fields to omap_hwmod_common_data.c
In reply to Tony LindgrenWe want to be able to eventually allocate these dynamically with the data for omap_hwmod_class_sysconfig coming from dts.
Note that omap_hwmod_sysc_type_smartreflex is the same as the older omap36xx_sr_sysc_fields, so let's use the earlier omap36xx_sr_sysc_fields instead.
--- arch/arm/mach-omap2/omap_hwmod.h | 6 ++++++ arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 21 ------------------- arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 17 +-------------- arch/arm/mach-omap2/omap_hwmod_7xx_data.c | 7 +------ arch/arm/mach-omap2/omap_hwmod_common_data.c | 31 ++++++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 43 deletions(-)
arch/arm/mach-omap2/omap_hwmod.h +6 -0
@@ -40,6 +40,12 @@ struct omap_device;extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1;extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2;extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3; +extern struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields; +extern struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields; +extern struct omap_hwmod_sysc_fields omap3_sham_sysc_fields; +extern struct omap_hwmod_sysc_fields omap3xxx_aes_sysc_fields; +extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_mcasp; +extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_usb_host_fs;/* * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +0 -21
@@ -1190,10 +1190,6 @@ static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = { };/* SR common */ -static struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields = { - .clkact_shift =20 , -}; -static struct omap_hwmod_class_sysconfig omap34xx_sr_sysc = { .sysc_offs =0x24 , .sysc_flags = (SYSC_HAS_CLOCKACTIVITY |SYSC_NO_CACHE ),
@@ -1206,11 +1202,6 @@ static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = { .rev = 1, }; -static struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields = { - .sidle_shift =24 , - .enwkup_shift =26 , -}; -static struct omap_hwmod_class_sysconfig omap36xx_sr_sysc = { .sysc_offs =0x38 , .idlemodes = (SIDLE_FORCE |SIDLE_NO |SIDLE_SMART ),
@@ -2731,12 +2722,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l3_main__gpmc = { };/* l4_core -> SHAM2 (SHA1/MD5) (similar to omap24xx) */ -static struct omap_hwmod_sysc_fields omap3_sham_sysc_fields = { - .sidle_shift =4 , - .srst_shift =1 , - .autoidle_shift =0 , -}; -static struct omap_hwmod_class_sysconfig omap3_sham_sysc = { .rev_offs =0x5c , .sysc_offs =0x60 ,
@@ -2777,12 +2762,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__sham = { };/* l4_core -> AES */ -static struct omap_hwmod_sysc_fields omap3xxx_aes_sysc_fields = { - .sidle_shift =6 , - .srst_shift =1 , - .autoidle_shift =0 , -}; -static struct omap_hwmod_class_sysconfig omap3_aes_sysc = { .rev_offs =0x44 , .sysc_offs =0x48 ,
arch/arm/mach-omap2/omap_hwmod_44xx_data.c +1 -16
@@ -1658,10 +1658,6 @@ static struct omap_hwmod omap44xx_mailbox_hwmod = {*/ /* The IP is not compliant to type1 / type2 scheme */ -static struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_mcasp = { - .sidle_shift =0 , -}; -static struct omap_hwmod_class_sysconfig omap44xx_mcasp_sysc = { .sysc_offs =0x0004 , .sysc_flags =SYSC_HAS_SIDLEMODE ,
@@ -2403,17 +2399,12 @@ static struct omap_hwmod omap44xx_slimbus2_hwmod = {*/ /* The IP is not compliant to type1 / type2 scheme */ -static struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_smartreflex = { - .sidle_shift =24 , - .enwkup_shift =26 , -}; -static struct omap_hwmod_class_sysconfig omap44xx_smartreflex_sysc = { .sysc_offs =0x0038 , .sysc_flags = (SYSC_HAS_ENAWAKEUP |SYSC_HAS_SIDLEMODE ), .idlemodes = (SIDLE_FORCE |SIDLE_NO |SIDLE_SMART |SIDLE_SMART_WKUP ), - .sysc_fields = &omap_hwmod_sysc_type_smartreflex, + .sysc_fields = &omap36xx_sr_sysc_fields, };static struct omap_hwmod_class omap44xx_smartreflex_hwmod_class = {
@@ -2844,12 +2835,6 @@ static struct omap_hwmod omap44xx_uart4_hwmod = {*/ /* The IP is not compliant to type1 / type2 scheme */ -static struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_usb_host_fs = { - .midle_shift =4 , - .sidle_shift =2 , - .srst_shift =1 , -}; -static struct omap_hwmod_class_sysconfig omap44xx_usb_host_fs_sysc = { .rev_offs =0x0000 , .sysc_offs =0x0210 ,
arch/arm/mach-omap2/omap_hwmod_7xx_data.c +1 -6
@@ -2055,17 +2055,12 @@ static struct omap_hwmod dra7xx_sata_hwmod = {*/ /* The IP is not compliant to type1 / type2 scheme */ -static struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_smartreflex = { - .sidle_shift =24 , - .enwkup_shift =26 , -}; -static struct omap_hwmod_class_sysconfig dra7xx_smartreflex_sysc = { .sysc_offs =0x0038 , .sysc_flags = (SYSC_HAS_ENAWAKEUP |SYSC_HAS_SIDLEMODE ), .idlemodes = (SIDLE_FORCE |SIDLE_NO |SIDLE_SMART |SIDLE_SMART_WKUP ), - .sysc_fields = &omap_hwmod_sysc_type_smartreflex, + .sysc_fields = &omap36xx_sr_sysc_fields, };static struct omap_hwmod_class dra7xx_smartreflex_hwmod_class = {
arch/arm/mach-omap2/omap_hwmod_common_data.c +31 -0
@@ -63,3 +63,34 @@ struct omap_dss_dispc_dev_attr omap2_3_dss_dispc_dev_attr = { .manager_count = 2, .has_framedonetv_irq = 0 }; + +struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields = { + .clkact_shift =20 , +}; + +struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields = { + .sidle_shift =24 , + .enwkup_shift =26 , +}; + +struct omap_hwmod_sysc_fields omap3_sham_sysc_fields = { + .sidle_shift =4 , + .srst_shift =1 , + .autoidle_shift =0 , +}; + +struct omap_hwmod_sysc_fields omap3xxx_aes_sysc_fields = { + .sidle_shift =6 , + .srst_shift =1 , + .autoidle_shift =0 , +}; + +struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_mcasp = { + .sidle_shift =0 , +}; + +struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_usb_host_fs = { + .midle_shift =4 , + .sidle_shift =2 , + .srst_shift =1 , +};
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 4/9 bus: ti-sysc: Make omap_hwmod_sysc_fields into sysc_regbits platform data
In reply to Tony LindgrenWe want to be able to configure hwmod sysc data from ti-sysc driver using platform data callbacks. So let's make struct omap_hwmod_sysc_fields into struct sysc_data and have it available for both ti-sysc driver and hwmod code.
Note that we can make it use s8 instead of u8 as the hwmod code uses the feature flags to check for this field. However, for ti-sysc we can use -ENODEV to indicate a feature is not supported in the hardware and can simplify the code that way.
And let's add also emufree_shift as the dts files will be describing the hardware for the SYSCONFIG register capbilities mask.
--- arch/arm/mach-omap2/omap_hwmod.c | 2 ++ arch/arm/mach-omap2/omap_hwmod.h | 40 +++++++--------------------- arch/arm/mach-omap2/omap_hwmod_common_data.c | 21 ++++++++------- include/linux/platform_data/ti-sysc.h | 29 ++++++++++++++++++++ 4 files changed, 53 insertions(+), 39 deletions(-) create mode 100644 include/linux/platform_data/ti-sysc.h
arch/arm/mach-omap2/omap_hwmod.c +2 -0
@@ -143,6 +143,8 @@#include <linux/of_address.h> #include <linux/bootmem.h> +#include <linux/platform_data/ti-sysc.h> +#include <asm/system_misc.h> #include "clock.h"
arch/arm/mach-omap2/omap_hwmod.h +10 -30
@@ -37,15 +37,15 @@struct omap_device ; -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1; -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2; -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3; -extern struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields; -extern struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields; -extern struct omap_hwmod_sysc_fields omap3_sham_sysc_fields; -extern struct omap_hwmod_sysc_fields omap3xxx_aes_sysc_fields; -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_mcasp; -extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_usb_host_fs; +extern struct sysc_regbits omap_hwmod_sysc_type1; +extern struct sysc_regbits omap_hwmod_sysc_type2; +extern struct sysc_regbits omap_hwmod_sysc_type3; +extern struct sysc_regbits omap34xx_sr_sysc_fields; +extern struct sysc_regbits omap36xx_sr_sysc_fields; +extern struct sysc_regbits omap3_sham_sysc_fields; +extern struct sysc_regbits omap3xxx_aes_sysc_fields; +extern struct sysc_regbits omap_hwmod_sysc_type_mcasp; +extern struct sysc_regbits omap_hwmod_sysc_type_usb_host_fs;/* * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant
@@ -290,26 +290,6 @@ struct omap_hwmod_ocp_if {#define CLOCKACT_TEST_ICLK 0x2#define CLOCKACT_TEST_NONE 0x3 -/** -* struct omap_hwmod_sysc_fields - hwmod OCP_SYSCONFIG register field offsets. -* @midle_shift: Offset of the midle bit -* @clkact_shift: Offset of the clockactivity bit -* @sidle_shift: Offset of the sidle bit -* @enwkup_shift: Offset of the enawakeup bit -* @srst_shift: Offset of the softreset bit -* @autoidle_shift: Offset of the autoidle bit -* @dmadisable_shift: Offset of the dmadisable bit -*/ -struct omap_hwmod_sysc_fields { -u8 midle_shift; -u8 clkact_shift; -u8 sidle_shift; -u8 enwkup_shift; -u8 srst_shift; -u8 autoidle_shift; -u8 dmadisable_shift; -}; -/** * struct omap_hwmod_class_sysconfig - hwmod class OCP_SYS* data * @rev_offs: IP block revision register offset (from module base addr)
@@ -341,7 +321,7 @@ struct omap_hwmod_class_sysconfig {u32 sysc_offs;u32 syss_offs;u16 sysc_flags; -struct omap_hwmod_sysc_fields *sysc_fields; +struct sysc_regbits *sysc_fields;u8 srst_udelay;u8 idlemodes; };
arch/arm/mach-omap2/omap_hwmod_common_data.c +12 -9
@@ -16,6 +16,9 @@* data and their integration with other OMAP modules and Linux. */ +#include <linux/types.h> +#include <linux/platform_data/ti-sysc.h> +#include "omap_hwmod.h" #include "omap_hwmod_common_data.h"
@@ -27,7 +30,7 @@* if the device ip is compliant with the original PRCM protocol * defined for OMAP2420. */ -struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1 = { +struct sysc_regbits omap_hwmod_sysc_type1 = { .midle_shift =SYSC_TYPE1_MIDLEMODE_SHIFT , .clkact_shift =SYSC_TYPE1_CLOCKACTIVITY_SHIFT , .sidle_shift =SYSC_TYPE1_SIDLEMODE_SHIFT ,
@@ -43,7 +46,7 @@ struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1 = {* device ip is compliant with the new PRCM protocol defined for new * OMAP4 IPs. */ -struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2 = { +struct sysc_regbits omap_hwmod_sysc_type2 = { .midle_shift =SYSC_TYPE2_MIDLEMODE_SHIFT , .sidle_shift =SYSC_TYPE2_SIDLEMODE_SHIFT , .srst_shift =SYSC_TYPE2_SOFTRESET_SHIFT ,
@@ -54,7 +57,7 @@ struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2 = {* struct omap_hwmod_sysc_type3 - TYPE3 sysconfig scheme. * Used by some IPs on AM33xx */ -struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3 = { +struct sysc_regbits omap_hwmod_sysc_type3 = { .midle_shift =SYSC_TYPE3_MIDLEMODE_SHIFT , .sidle_shift =SYSC_TYPE3_SIDLEMODE_SHIFT , };
@@ -64,32 +67,32 @@ struct omap_dss_dispc_dev_attr omap2_3_dss_dispc_dev_attr = { .has_framedonetv_irq = 0 }; -struct omap_hwmod_sysc_fields omap34xx_sr_sysc_fields = { +struct sysc_regbits omap34xx_sr_sysc_fields = { .clkact_shift =20 , }; -struct omap_hwmod_sysc_fields omap36xx_sr_sysc_fields = { +struct sysc_regbits omap36xx_sr_sysc_fields = { .sidle_shift =24 , .enwkup_shift =26 , }; -struct omap_hwmod_sysc_fields omap3_sham_sysc_fields = { +struct sysc_regbits omap3_sham_sysc_fields = { .sidle_shift =4 , .srst_shift =1 , .autoidle_shift =0 , }; -struct omap_hwmod_sysc_fields omap3xxx_aes_sysc_fields = { +struct sysc_regbits omap3xxx_aes_sysc_fields = { .sidle_shift =6 , .srst_shift =1 , .autoidle_shift =0 , }; -struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_mcasp = { +struct sysc_regbits omap_hwmod_sysc_type_mcasp = { .sidle_shift =0 , }; -struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_usb_host_fs = { +struct sysc_regbits omap_hwmod_sysc_type_usb_host_fs = { .midle_shift =4 , .sidle_shift =2 , .srst_shift =1 ,
include/linux/platform_data/ti-sysc.h new file +29 -0
@@ -0,0 +1,29 @@ +#ifndef __TI_SYSC_DATA_H__ +#define __TI_SYSC_DATA_H__ + +/** +* struct sysc_regbits - TI OCP_SYSCONFIG register field offsets +* @midle_shift: Offset of the midle bit +* @clkact_shift: Offset of the clockactivity bit +* @sidle_shift: Offset of the sidle bit +* @enwkup_shift: Offset of the enawakeup bit +* @srst_shift: Offset of the softreset bit +* @autoidle_shift: Offset of the autoidle bit +* @dmadisable_shift: Offset of the dmadisable bit +* @emufree_shift; Offset of the emufree bit +* +* Note that 0 is a valid shift, and for ti-sysc.c -ENODEV can be used if a +* feature is not available. +*/ +struct sysc_regbits { +s8 midle_shift; +s8 clkact_shift; +s8 sidle_shift; +s8 enwkup_shift; +s8 srst_shift; +s8 autoidle_shift; +s8 dmadisable_shift; +s8 emufree_shift; +}; + +#endif /* __TI_SYSC_DATA_H__ */
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 5/9 bus: ti-sysc: Add register bits for interconnect target modules
In reply to Tony LindgrenLet's add data for the known interconnect target module types by mapping their register bits.
Note that we can handle many quirks for the older omap2 type1 modules directly in the driver without a need for adding custom properties.
--- drivers/bus/ti-sysc.c | 256 ++++++++++++++++++++++++++++++++-- include/linux/platform_data/ti-sysc.h | 40 ++++++ 2 files changed, 286 insertions(+), 10 deletions(-)
drivers/bus/ti-sysc.c +246 -10
@@ -18,6 +18,9 @@#include <linux/pm_runtime.h> #include <linux/of_address.h> #include <linux/of_platform.h> +#include <linux/platform_data/ti-sysc.h> + +#include <dt-bindings/bus/ti-sysc.h> enum sysc_registers {SYSC_REVISION ,
@@ -45,6 +48,8 @@ static const char * const clock_names[] = { "fck", "ick", };* @offsets: register offsets from module base * @clocks: clocks used by the interconnect target module * @legacy_mode: configured for legacy mode if set +* @cap: interconnect target module capabilities +* @cfg: interconnect target module configuration */ struct sysc {struct device *dev;
@@ -54,6 +59,8 @@ struct sysc {int offsets[SYSC_MAX_REGS ];struct clk *clocks[SYSC_MAX_CLOCKS ];const char *legacy_mode; +const struct sysc_capabilities *cap; +struct sysc_config cfg; };static u32 sysc_read_revision (struct sysc *ddata)
@@ -474,6 +481,228 @@ static void sysc_unprepare(struct sysc *ddata) } } +/* +* Common sysc register bits found on omap2, also known as type1 +*/ +static const struct sysc_regbits sysc_regbits_omap2 = { + .dmadisable_shift = -ENODEV , + .midle_shift =12 , + .sidle_shift =3 , + .clkact_shift =8 , + .emufree_shift =5 , + .enwkup_shift =2 , + .srst_shift =1 , + .autoidle_shift =0 , +}; + +static const struct sysc_capabilities sysc_omap2 = { + .type =TI_SYSC_OMAP2 , + .sysc_mask =SYSC_OMAP2_CLOCKACTIVITY |SYSC_OMAP2_EMUFREE | +SYSC_OMAP2_ENAWAKEUP |SYSC_OMAP2_SOFTRESET | +SYSC_OMAP2_AUTOIDLE , + .regbits = &sysc_regbits_omap2, +}; + +/* All omap2 and 3 timers, and timers 1, 2 & 10 on omap 4 and 5 */ +static const struct sysc_capabilities sysc_omap2_timer = { + .type =TI_SYSC_OMAP2_TIMER , + .sysc_mask =SYSC_OMAP2_CLOCKACTIVITY |SYSC_OMAP2_EMUFREE | +SYSC_OMAP2_ENAWAKEUP |SYSC_OMAP2_SOFTRESET | +SYSC_OMAP2_AUTOIDLE , + .regbits = &sysc_regbits_omap2, + .mod_quirks =SYSC_QUIRK_USE_CLOCKACT , +}; + +/* +* SHAM2 (SHA1/MD5) sysc found on omap3, a variant of sysc_regbits_omap2 +* with different sidle position +*/ +static const struct sysc_regbits sysc_regbits_omap3_sham = { + .dmadisable_shift = -ENODEV , + .midle_shift = -ENODEV , + .sidle_shift =4 , + .clkact_shift = -ENODEV , + .enwkup_shift = -ENODEV , + .srst_shift =1 , + .autoidle_shift =0 , + .emufree_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_omap3_sham = { + .type =TI_SYSC_OMAP3_SHAM , + .sysc_mask =SYSC_OMAP2_SOFTRESET |SYSC_OMAP2_AUTOIDLE , + .regbits = &sysc_regbits_omap3_sham, +}; + +/* +* AES register bits found on omap3 and later, a variant of +* sysc_regbits_omap2 with different sidle position +*/ +static const struct sysc_regbits sysc_regbits_omap3_aes = { + .dmadisable_shift = -ENODEV , + .midle_shift = -ENODEV , + .sidle_shift =6 , + .clkact_shift = -ENODEV , + .enwkup_shift = -ENODEV , + .srst_shift =1 , + .autoidle_shift =0 , + .emufree_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_omap3_aes = { + .type =TI_SYSC_OMAP3_AES , + .sysc_mask =SYSC_OMAP2_SOFTRESET |SYSC_OMAP2_AUTOIDLE , + .regbits = &sysc_regbits_omap3_aes, +}; + +/* +* Common sysc register bits found on omap4, also known as type2 +*/ +static const struct sysc_regbits sysc_regbits_omap4 = { + .dmadisable_shift =16 , + .midle_shift =4 , + .sidle_shift =2 , + .clkact_shift = -ENODEV , + .enwkup_shift = -ENODEV , + .emufree_shift =1 , + .srst_shift =0 , + .autoidle_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_omap4 = { + .type =TI_SYSC_OMAP4 , + .sysc_mask =SYSC_OMAP4_DMADISABLE |SYSC_OMAP4_FREEEMU | +SYSC_OMAP4_SOFTRESET , + .regbits = &sysc_regbits_omap4, +}; + +static const struct sysc_capabilities sysc_omap4_timer = { + .type =TI_SYSC_OMAP4_TIMER , + .sysc_mask =SYSC_OMAP4_DMADISABLE |SYSC_OMAP4_FREEEMU | +SYSC_OMAP4_SOFTRESET , + .regbits = &sysc_regbits_omap4, +}; + +/* +* Common sysc register bits found on omap4, also known as type3 +*/ +static const struct sysc_regbits sysc_regbits_omap4_simple = { + .dmadisable_shift = -ENODEV , + .midle_shift =2 , + .sidle_shift =0 , + .clkact_shift = -ENODEV , + .enwkup_shift = -ENODEV , + .srst_shift = -ENODEV , + .emufree_shift = -ENODEV , + .autoidle_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_omap4_simple = { + .type =TI_SYSC_OMAP4_SIMPLE , + .regbits = &sysc_regbits_omap4_simple, +}; + +/* +* SmartReflex sysc found on omap34xx +*/ +static const struct sysc_regbits sysc_regbits_omap34xx_sr = { + .dmadisable_shift = -ENODEV , + .midle_shift = -ENODEV , + .sidle_shift = -ENODEV , + .clkact_shift =20 , + .enwkup_shift = -ENODEV , + .srst_shift = -ENODEV , + .emufree_shift = -ENODEV , + .autoidle_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_34xx_sr = { + .type =TI_SYSC_OMAP34XX_SR , + .sysc_mask =SYSC_OMAP2_CLOCKACTIVITY , + .regbits = &sysc_regbits_omap34xx_sr, + .mod_quirks =SYSC_QUIRK_USE_CLOCKACT |SYSC_QUIRK_UNCACHED , +}; + +/* +* SmartReflex sysc found on omap36xx and later +*/ +static const struct sysc_regbits sysc_regbits_omap36xx_sr = { + .dmadisable_shift = -ENODEV , + .midle_shift = -ENODEV , + .sidle_shift =24 , + .clkact_shift = -ENODEV , + .enwkup_shift =26 , + .srst_shift = -ENODEV , + .emufree_shift = -ENODEV , + .autoidle_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_36xx_sr = { + .type =TI_SYSC_OMAP36XX_SR , + .sysc_mask =SYSC_OMAP2_ENAWAKEUP , + .regbits = &sysc_regbits_omap36xx_sr, + .mod_quirks =SYSC_QUIRK_UNCACHED , +}; + +static const struct sysc_capabilities sysc_omap4_sr = { + .type =TI_SYSC_OMAP4_SR , + .regbits = &sysc_regbits_omap36xx_sr, +}; + +/* +* McASP register bits found on omap4 and later +*/ +static const struct sysc_regbits sysc_regbits_omap4_mcasp = { + .dmadisable_shift = -ENODEV , + .midle_shift = -ENODEV , + .sidle_shift =0 , + .clkact_shift = -ENODEV , + .enwkup_shift = -ENODEV , + .srst_shift = -ENODEV , + .emufree_shift = -ENODEV , + .autoidle_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_omap4_mcasp = { + .type =TI_SYSC_OMAP4_MCASP , + .regbits = &sysc_regbits_omap4_mcasp, +}; + +/* +* FS USB host found on omap4 and later +*/ +static const struct sysc_regbits sysc_regbits_omap4_usb_host_fs = { + .dmadisable_shift = -ENODEV , + .midle_shift = -ENODEV , + .sidle_shift =24 , + .clkact_shift = -ENODEV , + .enwkup_shift =26 , + .srst_shift = -ENODEV , + .emufree_shift = -ENODEV , + .autoidle_shift = -ENODEV , +}; + +static const struct sysc_capabilities sysc_omap4_usb_host_fs = { + .type =TI_SYSC_OMAP4_USB_HOST_FS , + .sysc_mask =SYSC_OMAP2_ENAWAKEUP , + .regbits = &sysc_regbits_omap4_usb_host_fs, +}; + +static int sysc_init_match (struct sysc *ddata) +{ +const struct sysc_capabilities *cap; + + cap =of_device_get_match_data (ddata->dev); +if (!cap) +return -EINVAL ; + + ddata->cap = cap; +if (ddata->cap) + ddata->cfg.quirks |= ddata->cap->mod_quirks; + +return 0 ; +} +static int sysc_probe (struct platform_device *pdev) {struct device_node *np = pdev->dev.of_node;
@@ -487,6 +716,10 @@ static int sysc_probe(struct platform_device *pdev) ddata->dev = &pdev->dev; ddata->legacy_mode =of_get_property (np,"ti,hwmods" ,NULL ); + error =sysc_init_match (ddata); +if (error) +return error; + error =sysc_get_clocks (ddata);if (error)return error;
@@ -554,16 +787,19 @@ static int sysc_remove(struct platform_device *pdev) }static const struct of_device_id sysc_match[] = { - { .compatible ="ti,sysc-omap2" }, - { .compatible ="ti,sysc-omap4" }, - { .compatible ="ti,sysc-omap4-simple" }, - { .compatible ="ti,sysc-omap3430-sr" }, - { .compatible ="ti,sysc-omap3630-sr" }, - { .compatible ="ti,sysc-omap4-sr" }, - { .compatible ="ti,sysc-omap3-sham" }, - { .compatible ="ti,sysc-omap-aes" }, - { .compatible ="ti,sysc-mcasp" }, - { .compatible ="ti,sysc-usb-host-fs" }, + { .compatible ="ti,sysc-omap2" , .data = &sysc_omap2, }, + { .compatible ="ti,sysc-omap2-timer" , .data = &sysc_omap2_timer, }, + { .compatible ="ti,sysc-omap4" , .data = &sysc_omap4, }, + { .compatible ="ti,sysc-omap4-timer" , .data = &sysc_omap4_timer, }, + { .compatible ="ti,sysc-omap4-simple" , .data = &sysc_omap4_simple, }, + { .compatible ="ti,sysc-omap3430-sr" , .data = &sysc_34xx_sr, }, + { .compatible ="ti,sysc-omap3630-sr" , .data = &sysc_36xx_sr, }, + { .compatible ="ti,sysc-omap4-sr" , .data = &sysc_omap4_sr, }, + { .compatible ="ti,sysc-omap3-sham" , .data = &sysc_omap3_sham, }, + { .compatible ="ti,sysc-omap-aes" , .data = &sysc_omap3_aes, }, + { .compatible ="ti,sysc-mcasp" , .data = &sysc_omap4_mcasp, }, + { .compatible ="ti,sysc-usb-host-fs" , + .data = &sysc_omap4_usb_host_fs, }, { }, };MODULE_DEVICE_TABLE (of, sysc_match);
include/linux/platform_data/ti-sysc.h +40 -0
@@ -1,6 +1,21 @@#ifndef __TI_SYSC_DATA_H__#define __TI_SYSC_DATA_H__ +enum ti_sysc_module_type { +TI_SYSC_OMAP2 , +TI_SYSC_OMAP2_TIMER , +TI_SYSC_OMAP3_SHAM , +TI_SYSC_OMAP3_AES , +TI_SYSC_OMAP4 , +TI_SYSC_OMAP4_TIMER , +TI_SYSC_OMAP4_SIMPLE , +TI_SYSC_OMAP34XX_SR , +TI_SYSC_OMAP36XX_SR , +TI_SYSC_OMAP4_SR , +TI_SYSC_OMAP4_MCASP , +TI_SYSC_OMAP4_USB_HOST_FS , +}; +/** * struct sysc_regbits - TI OCP_SYSCONFIG register field offsets * @midle_shift: Offset of the midle bit
@@ -26,4 +41,29 @@ struct sysc_regbits { s8 emufree_shift; }; +#define SYSC_QUIRK_UNCACHED BIT(1) +#define SYSC_QUIRK_USE_CLOCKACT BIT(0) + +/** +* struct sysc_capabilities - capabilities for an interconnect target module +* +* @sysc_mask: bitmask of supported SYSCONFIG register bits +* @regbits: bitmask of SYSCONFIG register bits +* @mod_quirks: bitmask of module specific quirks +*/ +struct sysc_capabilities { +const enum ti_sysc_module_type type; +const u32 sysc_mask; +const struct sysc_regbits *regbits; +const u32 mod_quirks; +}; + +/** +* struct sysc_config - configuration for an interconnect target module +* @quirks: bitmask of enabled quirks +*/ +struct sysc_config { +u32 quirks; +}; +#endif /* __TI_SYSC_DATA_H__ */
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 6/9 bus: ti-sysc: Detect i2c interconnect target module based on register layout
In reply to Tony LindgrenWe can easily detect i2c based on it's non-standard module registers that consist of two 32-bit registers accessed in 16-bit mode.
So far we don't have other 16-bit modules, so there's currently no need to add a custom property for 16-bit register access.
--- drivers/bus/ti-sysc.c | 17 +++++++++++++++++ include/linux/platform_data/ti-sysc.h | 1 + 2 files changed, 18 insertions(+)
drivers/bus/ti-sysc.c +17 -0
@@ -213,6 +213,21 @@ static int sysc_check_children(struct sysc *ddata)return 0 ; } +/* +* So far only I2C uses 16-bit read access with clockactivity with revision +* in two registers with stride of 4. We can detect this based on the rev +* register size to configure things far enough to be able to properly read +* the revision register. +*/ +static void sysc_check_quirk_16bit (struct sysc *ddata,struct resource *res) +{ +if (resource_size (res) ==8 ) { +dev_dbg (ddata->dev, +"enabling 16-bit and clockactivity quirks\n" ); + ddata->cfg.quirks |=SYSC_QUIRK_16BIT |SYSC_QUIRK_USE_CLOCKACT ; + } +} +/** * sysc_parse_one - parses the interconnect target module registers * @ddata: device driver data
@@ -243,6 +258,8 @@ static int sysc_parse_one(struct sysc *ddata, enum sysc_registers reg) } ddata->offsets[reg] = res->start - ddata->module_pa; +if (reg ==SYSC_REVISION ) +sysc_check_quirk_16bit (ddata, res);return 0 ; }
include/linux/platform_data/ti-sysc.h +1 -0
@@ -41,6 +41,7 @@ struct sysc_regbits {s8 emufree_shift; }; +#define SYSC_QUIRK_16BIT BIT(2)#define SYSC_QUIRK_UNCACHED BIT(1)#define SYSC_QUIRK_USE_CLOCKACT BIT(0)
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 7/9 bus: ti-sysc: Handle module quirks based dts configuration
In reply to Tony LindgrenLet's configure few module quirks via device tree using the properties for "ti,no-idle-on-init", "ti,no-reset-on-init" and "ti,sysc-delay-us".
Let's also reorder the probe a bit so we have pdata available earlier, and move the PM runtime calls to sysc_init_module() from sysc_read_revision().
--- drivers/bus/ti-sysc.c | 114 ++++++++++++++++++++++++++++------ include/linux/platform_data/ti-sysc.h | 6 ++ 2 files changed, 102 insertions(+), 18 deletions(-)
drivers/bus/ti-sysc.c +96 -18
@@ -50,6 +50,8 @@ static const char * const clock_names[] = { "fck", "ick", };* @legacy_mode: configured for legacy mode if set * @cap: interconnect target module capabilities * @cfg: interconnect target module configuration +* @name: name if available +* @revision: interconnect target module revision */ struct sysc {struct device *dev;
@@ -61,12 +63,32 @@ struct sysc {const char *legacy_mode;const struct sysc_capabilities *cap;struct sysc_config cfg; +const char *name; +u32 revision; }; +static u32 sysc_read (struct sysc *ddata,int offset) +{ +if (ddata->cfg.quirks &SYSC_QUIRK_16BIT ) { +u32 val; + + val =readw_relaxed (ddata->module_va + offset); + val |= (readw_relaxed (ddata->module_va + offset +4 ) <<16 ); + +return val; + } + +return readl_relaxed (ddata->module_va + offset); +} +static u32 sysc_read_revision (struct sysc *ddata) { -return readl_relaxed (ddata->module_va + - ddata->offsets[SYSC_REVISION ]); +int offset = ddata->offsets[SYSC_REVISION ]; + +if (offset <0 ) +return 0 ; + +return sysc_read (ddata, offset); } static int sysc_get_one_clock(struct sysc *ddata,
@@ -393,22 +415,12 @@ static int sysc_map_and_check_registers(struct sysc *ddata)*/ static int sysc_show_rev (char *bufp,struct sysc *ddata) { -int error, len; +int len;if (ddata->offsets[SYSC_REVISION ] <0 )return sprintf (bufp,":NA" ); - error =pm_runtime_get_sync (ddata->dev); -if (error <0 ) { -pm_runtime_put_noidle (ddata->dev); - -return 0 ; - } - - len =sprintf (bufp,":%08x" ,sysc_read_revision (ddata)); - -pm_runtime_mark_last_busy (ddata->dev); -pm_runtime_put_autosuspend (ddata->dev); + len =sprintf (bufp,":%08x" , ddata->revision);return len; }
@@ -488,6 +500,66 @@ static const struct dev_pm_ops sysc_pm_ops = { NULL) }; +/* At this point the module is configured enough to read the revision */ +static int sysc_init_module (struct sysc *ddata) +{ +int error; + + error =pm_runtime_get_sync (ddata->dev); +if (error <0 ) { +pm_runtime_put_noidle (ddata->dev); + +return 0 ; + } + ddata->revision =sysc_read_revision (ddata); +pm_runtime_put_sync (ddata->dev); + +return 0 ; +} + +/* Device tree configured quirks */ +struct sysc_dts_quirk { +const char *name; +u32 mask; +}; + +static const struct sysc_dts_quirk sysc_dts_quirks[] = { + { .name ="ti,no-idle-on-init" , + .mask =SYSC_QUIRK_NO_IDLE_ON_INIT , }, + { .name ="ti,no-reset-on-init" , + .mask =SYSC_QUIRK_NO_RESET_ON_INIT , }, +}; + +static int sysc_init_dts_quirks (struct sysc *ddata) +{ +struct device_node *np = ddata->dev->of_node; +const struct property *prop; +int i, len, error; +u32 val; + + ddata->legacy_mode =of_get_property (np,"ti,hwmods" ,NULL ); + +for (i =0 ; i <ARRAY_SIZE (sysc_dts_quirks); i++) { + prop =of_get_property (np, sysc_dts_quirks[i].name, &len); +if (!prop) +break ; + + ddata->cfg.quirks |= sysc_dts_quirks[i].mask; + } + + error =of_property_read_u32 (np,"ti,sysc-delay-us" , &val); +if (!error) { +if (val >255 ) { +dev_warn (ddata->dev,"bad ti,sysc-delay-us: %i\n" , + val); + } + + ddata->cfg.srst_udelay = (u8 )val; + } + +return 0 ; +} +static void sysc_unprepare (struct sysc *ddata) {int i;
@@ -722,7 +794,6 @@ static int sysc_init_match(struct sysc *ddata)static int sysc_probe (struct platform_device *pdev) { -struct device_node *np = pdev->dev.of_node;struct sysc *ddata;int error;
@@ -731,12 +802,16 @@ static int sysc_probe(struct platform_device *pdev)return -ENOMEM ; ddata->dev = &pdev->dev; - ddata->legacy_mode =of_get_property (np,"ti,hwmods" ,NULL ); +platform_set_drvdata (pdev, ddata); error =sysc_init_match (ddata);if (error)return error; + error =sysc_init_dts_quirks (ddata); +if (error) + goto unprepare; + error =sysc_get_clocks (ddata);if (error)return error;
@@ -745,9 +820,12 @@ static int sysc_probe(struct platform_device *pdev)if (error) goto unprepare; -platform_set_drvdata (pdev, ddata); -pm_runtime_enable (ddata->dev); + + error =sysc_init_module (ddata); +if (error) + goto unprepare; + error =pm_runtime_get_sync (ddata->dev);if (error <0 ) {pm_runtime_put_noidle (ddata->dev);
include/linux/platform_data/ti-sysc.h +6 -0
@@ -41,6 +41,10 @@ struct sysc_regbits {s8 emufree_shift; }; +#define SYSC_QUIRK_NO_IDLE_ON_INIT BIT(6) +#define SYSC_QUIRK_NO_RESET_ON_INIT BIT(5) +#define SYSC_QUIRK_OPT_CLKS_NEEDED BIT(4) +#define SYSC_QUIRK_OPT_CLKS_IN_RESET BIT(3)#define SYSC_QUIRK_16BIT BIT(2)#define SYSC_QUIRK_UNCACHED BIT(1)#define SYSC_QUIRK_USE_CLOCKACT BIT(0)
@@ -61,9 +65,11 @@ struct sysc_capabilities {/** * struct sysc_config - configuration for an interconnect target module +* @srst_udelay: optional delay needed after OCP soft reset * @quirks: bitmask of enabled quirks */ struct sysc_config { +u8 srst_udelay;u32 quirks; };
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 8/9 bus: ti-sysc: Add parsing of module capabilities
In reply to Tony LindgrenWe need to configure the interconnect target module based on the device three configuration.
Let's also add a new quirk for SYSC_QUIRK_RESET_STATUS to indicate that the SYSCONFIG reset bit changes after the reset is done.
--- drivers/bus/ti-sysc.c | 100 ++++++++++++++++++++++++++++++++++ include/linux/platform_data/ti-sysc.h | 10 ++++ 2 files changed, 110 insertions(+)
drivers/bus/ti-sysc.c +100 -0
@@ -39,6 +39,9 @@ enum sysc_clocks {static const char *const clock_names[] = {"fck" ,"ick" , }; +#define SYSC_IDLEMODE_MASK 3 +#define SYSC_CLOCKACTIVITY_MASK 3 +/** * struct sysc - TI sysc interconnect target module registers and capabilities * @dev: struct device pointer
@@ -517,6 +520,91 @@ static int sysc_init_module(struct sysc *ddata)return 0 ; } +static int sysc_init_sysc_mask (struct sysc *ddata) +{ +struct device_node *np = ddata->dev->of_node; +int error; +u32 val; + + error =of_property_read_u32 (np,"ti,sysc-mask" , &val); +if (error) +return 0 ; + +if (val) + ddata->cfg.sysc_val = val & ddata->cap->sysc_mask; +else + ddata->cfg.sysc_val = ddata->cap->sysc_mask; + +return 0 ; +} + +static int sysc_init_idlemode (struct sysc *ddata,u8 *idlemodes, +const char *name) +{ +struct device_node *np = ddata->dev->of_node; +struct property *prop; +const __be32 *p; +u32 val; + +of_property_for_each_u32 (np, name, prop, p, val) { +if (val >=SYSC_NR_IDLEMODES ) { +dev_err (ddata->dev,"invalid idlemode: %i\n" , val); +return -EINVAL ; + } + *idlemodes |= (1 << val); + } + +return 0 ; +} + +static int sysc_init_idlemodes (struct sysc *ddata) +{ +int error; + + error =sysc_init_idlemode (ddata, &ddata->cfg.midlemodes, +"ti,sysc-midle" ); +if (error) +return error; + + error =sysc_init_idlemode (ddata, &ddata->cfg.sidlemodes, +"ti,sysc-sidle" ); +if (error) +return error; + +return 0 ; +} + +/* +* Only some devices on omap4 and later have SYSCONFIG reset done +* bit. We can detect this if there is no SYSSTATUS at all, or the +* SYSTATUS bit 0 is not used. Note that some SYSSTATUS registers +* have multiple bits for the child devices like OHCI and EHCI. +* Depends on SYSC being parsed first. +*/ +static int sysc_init_syss_mask (struct sysc *ddata) +{ +struct device_node *np = ddata->dev->of_node; +int error; +u32 val; + + error =of_property_read_u32 (np,"ti,syss-mask" , &val); +if (error) { +if ((ddata->cap->type ==TI_SYSC_OMAP4 || + ddata->cap->type ==TI_SYSC_OMAP4_TIMER ) && + (ddata->cfg.sysc_val &SYSC_OMAP4_SOFTRESET )) + ddata->cfg.quirks |=SYSC_QUIRK_RESET_STATUS ; + +return 0 ; + } + +if (!(val &1 ) && (ddata->cfg.sysc_val &SYSC_OMAP4_SOFTRESET )) + ddata->cfg.quirks |=SYSC_QUIRK_RESET_STATUS ; + + ddata->cfg.syss_mask = val; + +return 0 ; +} +/* Device tree configured quirks */ struct sysc_dts_quirk {const char *name;
@@ -820,6 +908,18 @@ static int sysc_probe(struct platform_device *pdev)if (error) goto unprepare; + error =sysc_init_sysc_mask (ddata); +if (error) + goto unprepare; + + error =sysc_init_idlemodes (ddata); +if (error) + goto unprepare; + + error =sysc_init_syss_mask (ddata); +if (error) + goto unprepare; +pm_runtime_enable (ddata->dev); error =sysc_init_module (ddata);
include/linux/platform_data/ti-sysc.h +10 -0
@@ -41,6 +41,7 @@ struct sysc_regbits {s8 emufree_shift; }; +#define SYSC_QUIRK_RESET_STATUS BIT(7)#define SYSC_QUIRK_NO_IDLE_ON_INIT BIT(6)#define SYSC_QUIRK_NO_RESET_ON_INIT BIT(5)#define SYSC_QUIRK_OPT_CLKS_NEEDED BIT(4)
@@ -49,6 +50,8 @@ struct sysc_regbits {#define SYSC_QUIRK_UNCACHED BIT(1)#define SYSC_QUIRK_USE_CLOCKACT BIT(0) +#define SYSC_NR_IDLEMODES 4 +/** * struct sysc_capabilities - capabilities for an interconnect target module *
@@ -65,10 +68,17 @@ struct sysc_capabilities {/** * struct sysc_config - configuration for an interconnect target module +* @sysc_val: configured value for sysc register +* @midlemodes: bitmask of supported master idle modes +* @sidlemodes: bitmask of supported master idle modes * @srst_udelay: optional delay needed after OCP soft reset * @quirks: bitmask of enabled quirks */ struct sysc_config { +u32 sysc_val; +u32 syss_mask; +u8 midlemodes; +u8 sidlemodes;u8 srst_udelay;u32 quirks; };
Signature · 1 line
2.15.0
Tony Lindgren
maintainerPATCH 9/9 ARM: dts: Update ti-sysc data for existing users
In reply to Tony LindgrenLet's update the existing users with features and clock data.
Note that we had few mistakes that did not get noticed as we're still probing the SmartReflex driver with legacy platform data and using "ti,hwmods" legacy property for ti-sysc driver.
So let's fix the dra7 smartreflex registers as they are different from omap4 with no revision register.
And on omap4, the mcasp module has a revision register according to the TRM.
--- arch/arm/boot/dts/dra7.dtsi | 26 ++++++++++++---- arch/arm/boot/dts/omap4.dtsi | 74 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 8 deletions(-)
arch/arm/boot/dts/dra7.dtsi +20 -6
@@ -7,6 +7,8 @@ * Based on "omap4.dtsi" */ +#include <dt-bindings/bus/ti-sysc.h> +#include <dt-bindings/clock/dra7.h> #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/pinctrl/dra.h>
@@ -1500,9 +1502,15 @@ target-module at 4a0dd000 { compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_core"; - reg = <0x4a0dd000 0x4>, - <0x4a0dd008 0x4>; - reg-names = "rev", "sysc"; + reg = <0x4a0dd038 0x4>; + reg-names = "sysc"; + ti,sysc-mask = <SYSC_OMAP3_SR_ENAWAKEUP>; + ti,sysc-sidle = <SYSC_IDLE_FORCE>, + <SYSC_IDLE_NO>, + <SYSC_IDLE_SMART>, + <SYSC_IDLE_SMART_WKUP>; + clocks = <&coreaon_clkctrl DRA7_SMARTREFLEX_CORE_CLKCTRL 0>; + clock-names = "fck"; #address-cells = <1>; #size-cells = <1>; ranges = <0 0x4a0dd000 0x001000>;
@@ -1513,9 +1521,15 @@ target-module at 4a0d9000 { compatible = "ti,sysc-omap4-sr", "ti,sysc"; ti,hwmods = "smartreflex_mpu"; - reg = <0x4a0d9000 0x4>, - <0x4a0d9008 0x4>; - reg-names = "rev", "sysc"; + reg = <0x4a0d9038 0x4>; + reg-names = "sysc"; + ti,sysc-mask = <SYSC_OMAP3_SR_ENAWAKEUP>; + ti,sysc-sidle = <SYSC_IDLE_FORCE>, + <SYSC_IDLE_NO>, + <SYSC_IDLE_SMART>, + <SYSC_IDLE_SMART_WKUP>; + clocks = <&coreaon_clkctrl DRA7_SMARTREFLEX_MPU_CLKCTRL 0>; + clock-names = "fck"; #address-cells = <1>; #size-cells = <1>; ranges = <0 0x4a0d9000 0x001000>;
arch/arm/boot/dts/omap4.dtsi +72 -2
140 lines not on this page · raw message
Signature · 1 line
2.15.0