PCI:Add SPEAr13xx PCie support
Subsystems (10)
v3 cover PCI:Add SPEAr13xx PCie support
First three patches are improvement and fixes for SPEAr13xx support. Next patch modify phy-core driver for its initialization during subsys_initcall(). Platform ahci driver is modified for phy hooks. Patch#6 and 7 modify/add support for SPEAr13xx SATA and PCIe.
These patches are tested with SPEAr1310 evaluation board:
- INTEL PRO 100/100 EP card
- USB xhci gen2 card
- Above cards connected through LeCROY PTC switch
Modifications for SATA are tested with SPEAr1340-evb board
Changes since v2:
- Incorporated comments to move SPEAr13xx PCIe and SATA phy specific routines to the phy framework
- Modify ahci driver to include phy hooks
- phy-core driver modifications for subsys_initcall()
Changes since v1:
- Few patches of the series are already accepted and applied to mainline e.g. pcie designware driver improvements,fixes for IO translation bug, PCIe dw driver maintainer. So dropped these from v2.
- Incorporated comment to move the common/reset PCIe code to the seperate driver
- PCIe and SATA share common PHY configuration registers, so move SATA platform code to the system config driver
Fourth patch is improves pcie designware driver and fixes the IO translation bug. IO translation bug fix leads to the working of PCIe EP devices connected to RC through switch.
PCIe driver support for SPEAr1310/40 platform board is added.
These patches are tested with SPEAr1310 evaluation board:
- INTEL PRO 100/100 EP card
- USB xhci gen2 card
- Above cards connected through LeCROY PTC switch
Mohit Kumar (2):
SPEAr13xx: defconfig: Update
MAINTAINERS: Add ST SPEAr13xx PCIe driver maintainer
Pratyush Anand (6):
clk: SPEAr13xx: Fix pcie clock name
SPEAr13xx: Fix static mapping table
phy: Initialize phy core with subsys_initcall
ata: ahci platform: Add phy hooks to make it more generic
SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver
pcie: SPEAr13xx: Add designware pcie support
.../devicetree/bindings/ata/ahci-platform.txt | 2 + .../devicetree/bindings/pci/spear13xx-pcie.txt | 7 + .../devicetree/bindings/phy/spear13xx-miphy.txt | 8 + MAINTAINERS | 6 + arch/arm/boot/dts/spear1310-evb.dts | 4 + arch/arm/boot/dts/spear1310.dtsi | 87 ++++- arch/arm/boot/dts/spear1340-evb.dts | 4 + arch/arm/boot/dts/spear1340.dtsi | 29 ++- arch/arm/boot/dts/spear13xx.dtsi | 10 +- arch/arm/configs/spear13xx_defconfig | 16 + arch/arm/mach-spear/Kconfig | 3 + arch/arm/mach-spear/include/mach/spear.h | 4 +- arch/arm/mach-spear/spear1340.c | 127 +----- arch/arm/mach-spear/spear13xx.c | 2 +- drivers/ata/ahci.h | 2 + drivers/ata/ahci_platform.c | 20 + drivers/clk/spear/spear1310_clock.c | 6 +- drivers/clk/spear/spear1340_clock.c | 2 +- drivers/pci/host/Kconfig | 5 + drivers/pci/host/Makefile | 1 + drivers/pci/host/pcie-spear13xx.c | 407 +++++++++++++++++ drivers/phy/Kconfig | 6 + drivers/phy/Makefile | 1 + drivers/phy/phy-core.c | 2 +- drivers/phy/phy-spear13xx-sata-pcie.c | 481 ++++++++++++++++++++ 25 files changed, 1102 insertions(+), 140 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/spear13xx-pcie.txt create mode 100644 Documentation/devicetree/bindings/phy/spear13xx-miphy.txt create mode 100644 drivers/pci/host/pcie-spear13xx.c create mode 100644 drivers/phy/phy-spear13xx-sata-pcie.c
PATCH v3 1/8 clk: SPEAr13xx: Fix pcie clock name
From: Pratyush Anand <[email protected]>
Follow dt clock naming convention for PCIe clocks.
--- drivers/clk/spear/spear1310_clock.c | 6 +++--- drivers/clk/spear/spear1340_clock.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/clk/spear/spear1310_clock.c +3 -3
@@ -742,19 +742,19 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) clk =clk_register_gate (NULL ,"pcie_sata_0_clk" ,"ahb_clk" ,0 ,SPEAR1310_PERIP1_CLK_ENB ,SPEAR1310_PCIE_SATA_0_CLK_ENB ,0 , &_lock); -clk_register_clkdev (clk,NULL ,"dw_pcie.0" ); +clk_register_clkdev (clk,NULL ,"b1000000.pcie" );clk_register_clkdev (clk,NULL ,"b1000000.ahci" ); clk =clk_register_gate (NULL ,"pcie_sata_1_clk" ,"ahb_clk" ,0 ,SPEAR1310_PERIP1_CLK_ENB ,SPEAR1310_PCIE_SATA_1_CLK_ENB ,0 , &_lock); -clk_register_clkdev (clk,NULL ,"dw_pcie.1" ); +clk_register_clkdev (clk,NULL ,"b1800000.pcie" );clk_register_clkdev (clk,NULL ,"b1800000.ahci" ); clk =clk_register_gate (NULL ,"pcie_sata_2_clk" ,"ahb_clk" ,0 ,SPEAR1310_PERIP1_CLK_ENB ,SPEAR1310_PCIE_SATA_2_CLK_ENB ,0 , &_lock); -clk_register_clkdev (clk,NULL ,"dw_pcie.2" ); +clk_register_clkdev (clk,NULL ,"b4000000.pcie" );clk_register_clkdev (clk,NULL ,"b4000000.ahci" ); clk = clk_register_gate(NULL, "sysram0_clk", "ahb_clk", 0,
drivers/clk/spear/spear1340_clock.c +1 -1
@@ -839,7 +839,7 @@ void __init spear1340_clk_init(void __iomem *misc_base) clk =clk_register_gate (NULL ,"pcie_sata_clk" ,"ahb_clk" ,0 ,SPEAR1340_PERIP1_CLK_ENB ,SPEAR1340_PCIE_SATA_CLK_ENB ,0 , &_lock); -clk_register_clkdev (clk,NULL ,"dw_pcie" ); +clk_register_clkdev (clk,NULL ,"b1000000.pcie" );clk_register_clkdev (clk,NULL ,"b1000000.ahci" ); clk = clk_register_gate(NULL, "sysram0_clk", "ahb_clk", 0,
Signature · 1 line
1.7.0.1
PATCH v3 2/8 SPEAr13xx: Fix static mapping table
In reply to Mohit KumarFrom: Pratyush Anand <[email protected]>
SPEAr13xx was using virtual address space 0xFE000000 to map physical address space 0xB3000000. pci_remap_io uses 0xFEE00000 as virtual address. So change 0xFE000000 to 0xF9000000.
--- arch/arm/mach-spear/include/mach/spear.h | 4 ++-- arch/arm/mach-spear/spear13xx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/mach-spear/include/mach/spear.h +2 -2
@@ -52,10 +52,10 @@#ifdef CONFIG_ARCH_SPEAR13XX #define PERIP_GRP2_BASE UL(0xB3000000) -#define VA_PERIP_GRP2_BASE IOMEM(0xFE000000) +#define VA_PERIP_GRP2_BASE IOMEM(0xF9000000)#define MCIF_SDHCI_BASE UL(0xB3000000)#define SYSRAM0_BASE UL(0xB3800000) -#define VA_SYSRAM0_BASE IOMEM(0xFE800000) +#define VA_SYSRAM0_BASE IOMEM(0xF9800000)#define SYS_LOCATION (VA_SYSRAM0_BASE + 0x600)#define PERIP_GRP1_BASE UL(0xE0000000)
arch/arm/mach-spear/spear13xx.c +1 -1
@@ -52,7 +52,7 @@ void __init spear13xx_l2x0_init(void)/* * Following will create 16MB static virtual/physical mappings * PHYSICAL VIRTUAL -* 0xB3000000 0xFE000000 +* 0xB3000000 0xF9000000 * 0xE0000000 0xFD000000 * 0xEC000000 0xFC000000 * 0xED000000 0xFB000000
Signature · 1 line
1.7.0.1
PATCH v3 3/8 SPEAr13xx: defconfig: Update
In reply to Mohit KumarEnable EABI, OEABI, VFP and NFS configs in default configuration file for SPEAr13xx.
--- arch/arm/configs/spear13xx_defconfig | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)
arch/arm/configs/spear13xx_defconfig +14 -0
@@ -14,10 +14,19 @@ CONFIG_MACH_SPEAR1340=y CONFIG_SMP=y # CONFIG_SMP_ON_UP is not set # CONFIG_ARM_CPU_TOPOLOGY is not set +CONFIG_AEABI=y +CONFIG_OABI_COMPAT=y CONFIG_ARM_APPENDED_DTB=y CONFIG_ARM_ATAG_DTB_COMPAT=y +CONFIG_VFP=y CONFIG_BINFMT_MISC=y CONFIG_NET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_NET_IPIP=y CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_MTD=y CONFIG_MTD_OF_PARTS=y
@@ -27,6 +36,7 @@ CONFIG_MTD_NAND=y CONFIG_MTD_NAND_FSMC=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_SD=y CONFIG_ATA=y # CONFIG_SATA_PMP is not set CONFIG_SATA_AHCI_PLATFORM=y
@@ -66,6 +76,7 @@ CONFIG_USB=y # CONFIG_USB_DEVICE_CLASS is not set CONFIG_USB_EHCI_HCD=y CONFIG_USB_OHCI_HCD=y +CONFIG_USB_STORAGE=y CONFIG_MMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SPEAR=y
@@ -79,11 +90,14 @@ CONFIG_EXT2_FS_SECURITY=y CONFIG_EXT3_FS=y CONFIG_EXT3_FS_SECURITY=y CONFIG_AUTOFS4_FS=m +CONFIG_FUSE_FS=y CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_IOCHARSET="ascii" CONFIG_TMPFS=y CONFIG_JFFS2_FS=y +CONFIG_NFS_FS=y +CONFIG_ROOT_NFS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ASCII=m
Signature · 1 line
1.7.0.1
PATCH v3 3/8 SPEAr13xx: defconfig: Update
Quoted 2 lines · Mohit Kumar
Enable EABI, OEABI, VFP and NFS configs in default configuration file for SPEAr13xx.
Are you sure about OABI_COMPAT? That seems unusual.
Also, please add all the options you need to multi_v7_defconfig and ensure that this configuration works with your hardware as well.
Arnd
PATCH v3 3/8 SPEAr13xx: defconfig: Update
Hello Arnd,
Quoted 7 lines
-----Original Message-----
From: Arnd Bergmann [mailto:arnd at arndb.de]
Sent: Thursday, January 30, 2014 6:32 PM
To: Mohit KUMAR DCG
Cc: Pratyush ANAND; spear-devel; linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH V3 3/8] SPEAr13xx: defconfig: Update
Quoted 5 lines
Quoted 2 lines · Mohit Kumar
Enable EABI, OEABI, VFP and NFS configs in default configuration file for SPEAr13xx.
Are you sure about
OABI_COMPAT? That seems unusual.
- yes, this option is not required
Quoted 3 lines
Also, please add all the options you need to
multi_v7_defconfigand ensure that this configuration works with your hardware as well.
- OK, will do this and test with SPEAr1310.
Thanks
Mohit
PATCH v3 4/8 phy: Initialize phy core with subsys_initcall
In reply to Mohit KumarFrom: Pratyush Anand <[email protected]>
PCIe RC drivers are initialized with subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.
Therefore initialize phy core driver with subsys_initcall to avoid calling of phy_get before phy_class is created.
--- drivers/phy/phy-core.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/phy/phy-core.c +1 -1
@@ -685,7 +685,7 @@ static int __init phy_core_init(void)return 0 ; } -module_init (phy_core_init); +subsys_initcall (phy_core_init); static void __exit phy_core_exit(void) {
Signature · 1 line
1.7.0.1
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
Hi,
Quoted 4 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.
Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint: drivers/Makefile).
Thanks
Kishon
Quoted 28 lines
Therefore initialize phy core driver with
subsys_initcallto avoid calling ofphy_getbeforephy_classis created.Signed-off-by Pratyush Anand <[email protected]>Cc Mohit Kumar <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Arnd Bergmann <[email protected]>--- drivers/phy/phy-core.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)drivers/phy/phy-core.c +1
-1@@ -685,7 +685,7 @@ static int __init phy_core_init(void)return 0 ; } -module_init (phy_core_init); +subsys_initcall (phy_core_init); static void __exit phy_core_exit(void) {
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
Quoted 10 lines · Kishon Vijay Abraham I
Hi,
Quoted 4 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint:
drivers/Makefile).
I think PCIe RC driver can not be made module init. Bjorn can comment better.
All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.
By the way, is there any side effect of loading phy driver very early?
Regards
Pratyush
Quoted 32 lines
Thanks
KishonQuoted 28 lines
Therefore initialize phy core driver with
subsys_initcallto avoid calling ofphy_getbeforephy_classis created.Signed-off-by Pratyush Anand <[email protected]>Cc Mohit Kumar <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Arnd Bergmann <[email protected]>--- drivers/phy/phy-core.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)drivers/phy/phy-core.c +1
-1@@ -685,7 +685,7 @@ static int __init phy_core_init(void)return 0 ; } -module_init (phy_core_init); +subsys_initcall (phy_core_init); static void __exit phy_core_exit(void) {
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
Hi,
Quoted 6 lines · Pratyush Anand
Quoted 5 lines · Kishon Vijay Abraham I
Hi,
Quoted 2 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint:
drivers/Makefile).I think PCIe RC driver can not be made module init. Bjorn can comment better.
Why not? I have used it for DRA7xx without any issues (I'll send that one upstream once the PIPE3 phy part gets clear).
Quoted 5 lines
All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.
the card drivers will anyway be probed only after RC driver comes up no?
Quoted 2 lines
By the way, is there any side effect of loading phy driver very early?
I assume you meant 'is there any side effect of using subsys_initcall?', since phy driver is loaded early anyway.
The answer is no just that module_init is common one and more people prefer to use module_init. (btw initial versions of phy-core had susbsys_initcall before it got changed to use module_init)
Thanks
Kishon
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
In reply to Pratyush AnandQuoted 6 lines · Pratyush ANAND
Quoted 5 lines · Kishon Vijay Abraham I
Hi,
Quoted 2 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint:
drivers/Makefile).From hint, you mean that if makefile has pci entry (and hence RC
driver entry) before card drivers entry, then it insures that rc driver's probe is called before card driver's probe?
I think, yes.
And if yes, then what you say is acceptable :)
Regards
Pratyush
Quoted 45 lines
I think PCIe RC driver can not be made module init. Bjorn can comment better.
All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.
By the way, is there any side effect of loading phy driver very early?
Regards
PratyushQuoted 32 lines
Thanks
KishonQuoted 28 lines
Therefore initialize phy core driver with
subsys_initcallto avoid calling ofphy_getbeforephy_classis created.Signed-off-by Pratyush Anand <[email protected]>Cc Mohit Kumar <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Arnd Bergmann <[email protected]>--- drivers/phy/phy-core.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)drivers/phy/phy-core.c +1
-1@@ -685,7 +685,7 @@ static int __init phy_core_init(void)return 0 ; } -module_init (phy_core_init); +subsys_initcall (phy_core_init); static void __exit phy_core_exit(void) {
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
Quoted 10 lines · Pratyush Anand
Quoted 9 lines · Pratyush ANAND
Quoted 8 lines · Kishon Vijay Abraham I
Hi,
Quoted 4 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.
Quoted 6 lines
Quoted 2 lines
Quoted 2 lines
Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint:
drivers/Makefile).From hint, you mean that if makefile has pci entry (and hence RC driver entry) before card drivers entry, then it insures that rc driver's probe is called before card driver's probe?
That's right but here I was referring to PHY and PCI.
Thanks
Kishon
Quoted 50 lines
I think, yes.
And if yes, then what you say is acceptable :)Regards
PratyushQuoted 45 lines
I think PCIe RC driver can not be made module init. Bjorn can comment better.
All PCIe card drivers are initialized with module init. RC driver must have been initialized before any card driver initialization. Currently, card drivers does not have deferred probe concept, so I am not sure if keeping RC driver as module init will work always.
By the way, is there any side effect of loading phy driver very early?
Regards
PratyushQuoted 32 lines
Thanks
KishonQuoted 28 lines
Therefore initialize phy core driver with
subsys_initcallto avoid calling ofphy_getbeforephy_classis created.Signed-off-by Pratyush Anand <[email protected]>Cc Mohit Kumar <[email protected]>Cc Kishon Vijay Abraham I <[email protected]>Cc Arnd Bergmann <[email protected]>--- drivers/phy/phy-core.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)drivers/phy/phy-core.c +1
-1@@ -685,7 +685,7 @@ static int __init phy_core_init(void)return 0 ; } -module_init (phy_core_init); +subsys_initcall (phy_core_init); static void __exit phy_core_exit(void) {
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
In reply to Pratyush AnandQuoted 6 lines · Pratyush Anand
Quoted 5 lines · Kishon Vijay Abraham I
Hi,
Quoted 2 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint:
drivers/Makefile).I think PCIe RC driver can not be made module init. Bjorn can comment better.
I don't think there is any problem here: the PCI devices will only appear after the PCIe root bus has been probed. All drivers using the regular pci_driver framework should work fine even if they are loaded before the device is found. There are a handful of drivers using 'pci_get_device' rather than pci_register_driver, and those will break. As far as I can tell, those drivers are all x86 specific, and you should not worry about them.
Having the PHY driver get initialized after the PCI root driver should also work, but it requires correct handling of -EPROBE_DEFER: if phy_get returns this error, the PCI driver must silently return the same error from its probe() function so it will get called again at a later time (after some other devices have been probed successfully).
Arnd
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
Quoted 24 lines · Arnd Bergmann
Quoted 6 lines · Pratyush Anand
Quoted 5 lines · Kishon Vijay Abraham I
Hi,
Quoted 2 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
PCIe RC drivers are initialized with
subsys_initcall. Few PCIe drivers like SPEAr13xx needs phy drivers to be initialized.Instead change PCIe RC drivers to module init. Phy drivers should be loaded very early otherwise. (Hint:
drivers/Makefile).I think PCIe RC driver can not be made module init. Bjorn can comment better.
I don't think there is any problem here: the PCI devices will only appear after the PCIe root bus has been probed. All drivers using the regular
pci_driverframework should work fine even if they are loaded before the device is found. There are a handful of drivers using 'pci_get_device' rather thanpci_register_driver, and those will break. As far as I can tell, those drivers are all x86 specific, and you should not worry about them.
Quoted 2 lines
Having the PHY driver get initialized after the PCI root driver should also work, but it requires correct handling of -EPROBE_DEFER: if
phy_get
I had issue with phy-core driver getting initialized after pcie rc driver. I found a kernel crash, as devm_phy_get was called before phy_class was created. I think this too need to be fixed, we should not see a crash.
Anyway, I will keep spear phy and rc driver both with module_init and -EPROBE_DEFER implementation.
Regards
Pratyush
Quoted 5 lines
returns this error, the PCI driver must silently return the same error from its
probe()function so it will get called again at a later time (after some other devices have been probed successfully).Arnd
Re: [PATCH V3 4/8] phy: Initialize phy core with subsys_initcall
Quoted 7 lines · Pratyush Anand
Quoted 2 lines
Having the PHY driver get initialized after the PCI root driver should also work, but it requires correct handling of -EPROBE_DEFER: if
phy_getI had issue with phy-core driver getting initialized after pcie rc driver. I found a kernel crash, as
devm_phy_getwas called beforephy_classwas created. I think this too need to be fixed, we should not see a crash.
Yes, agreed. This should be trivial to do though.
Quoted 2 lines
Anyway, I will keep spear phy and rc driver both with
module_initand -EPROBE_DEFER implementation.
Ok.
Arnd
PATCH v3 5/8 ata: ahci platform: Add phy hooks to make it more generic
In reply to Mohit KumarFrom: Pratyush Anand <[email protected]>
Few platform does only phy specific work in platform callbacks. It is better to use standard phy callbacks for such platform in stead of platform callbacks.
This patch does not break any platform callbacks. It adds phy plugins on top of that.
It has been assumed that no platform will need both phy plugins as well as platform callbacks.
--- .../devicetree/bindings/ata/ahci-platform.txt | 2 ++ drivers/ata/ahci.h | 2 ++ drivers/ata/ahci_platform.c | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 0 deletions(-)
Documentation/devicetree/bindings/ata/ahci-platform.txt +2 -0
@@ -10,6 +10,8 @@ Required properties: Optional properties: - dma-coherent : Present if dma operations are coherent +- phys : phandle to phy node associated with ahci controller +- phy-names : must be "ahci-phy" Example: sata@ffe08000 {
drivers/ata/ahci.h +2 -0
@@ -37,6 +37,7 @@#include <linux/clk.h> #include <linux/libata.h> +#include <linux/phy/phy.h> /* Enclosure Management Control */ #define EM_CTRL_MSG_TYPE 0x000f0000
@@ -322,6 +323,7 @@ struct ahci_host_priv {u32 em_buf_sz;/* EM buffer size in byte */ u32 em_msg_type;/* EM message type */ struct clk *clk;/* Only for platforms supporting clk */ +struct phy *phy;/* associated phy struct */ void *plat_data;/* Other platform data */ };
drivers/ata/ahci_platform.c +20 -0
@@ -123,6 +123,12 @@ static int ahci_probe(struct platform_device *pdev)return -ENOMEM ; } +/* +* all ahci platform may not have phy node. So no need to +* check return value of devm_phy_get. +*/ + hpriv->phy =devm_phy_get (dev,"ahci-phy" ); + hpriv->flags |= (unsigned long )pi.private_data; hpriv->mmio =devm_ioremap (dev, mem->start,resource_size (mem));
@@ -152,6 +158,10 @@ static int ahci_probe(struct platform_device *pdev) rc = pdata->init (dev, hpriv->mmio);if (rc) goto disable_unprepare_clk; + }else if (hpriv->phy && hpriv->phy->ops->init) { + rc = hpriv->phy->ops->init (hpriv->phy); +if (rc) + goto disable_unprepare_clk; } ahci_save_initial_config(dev, hpriv,
@@ -221,6 +231,8 @@ static int ahci_probe(struct platform_device *pdev) pdata_exit:if (pdata && pdata->exit) pdata->exit (dev); +else if (hpriv->phy && hpriv->phy->ops->exit) + hpriv->phy->ops->exit (hpriv->phy); disable_unprepare_clk:if (!IS_ERR (hpriv->clk))clk_disable_unprepare (hpriv->clk);
@@ -238,6 +250,8 @@ static void ahci_host_stop(struct ata_host *host)if (pdata && pdata->exit) pdata->exit (dev); +else if (hpriv->phy && hpriv->phy->ops->exit) + hpriv->phy->ops->exit (hpriv->phy);if (!IS_ERR (hpriv->clk)) {clk_disable_unprepare (hpriv->clk);
@@ -276,6 +290,8 @@ static int ahci_suspend(struct device *dev)if (pdata && pdata->suspend)return pdata->suspend (dev); +else if (hpriv->phy && hpriv->phy->ops->power_off) +return hpriv->phy->ops->power_off (hpriv->phy);if (!IS_ERR (hpriv->clk))clk_disable_unprepare (hpriv->clk);
@@ -302,6 +318,10 @@ static int ahci_resume(struct device *dev) rc = pdata->resume (dev);if (rc) goto disable_unprepare_clk; + }else if (hpriv->phy && hpriv->phy->ops->power_on) { + rc = hpriv->phy->ops->power_on (hpriv->phy); +if (rc) + goto disable_unprepare_clk; }if (dev->power.power_state.event ==PM_EVENT_SUSPEND ) {
Signature · 1 line
1.7.0.1
Re: [PATCH V3 5/8] ata: ahci platform: Add phy hooks to make it more generic
Quoted 12 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
Few platform does only phy specific work in platform callbacks. It is better to use standard phy callbacks for such platform in stead of platform callbacks.
This patch does not break any platform callbacks. It adds phy plugins on top of that.
It has been assumed that no platform will need both phy plugins as well as platform callbacks.
Quoted 6 lines
Signed-off-by Pratyush Anand <[email protected]>Cc Mohit Kumar <[email protected]>Cc Tejun Heo <[email protected]>Cc Arnd Bergmann <[email protected]>
This patch looks good to me, but as I mentioned, there has been some related work recently. Please see the patch from Roger Quadros posted at http://lkml.org/lkml/2014/1/8/142
One of the two should be enough.
Arnd
Re: [PATCH V3 5/8] ata: ahci platform: Add phy hooks to make it more generic
Quoted 20 lines · Arnd Bergmann
Quoted 12 lines · Mohit Kumar
From: Pratyush Anand <[email protected]>
Few platform does only phy specific work in platform callbacks. It is better to use standard phy callbacks for such platform in stead of platform callbacks.
This patch does not break any platform callbacks. It adds phy plugins on top of that.
It has been assumed that no platform will need both phy plugins as well as platform callbacks.
Quoted 6 lines
Signed-off-by Pratyush Anand <[email protected]>Cc Mohit Kumar <[email protected]>Cc Tejun Heo <[email protected]>Cc Arnd Bergmann <[email protected]>
Quoted 3 lines
This patch looks good to me, but as I mentioned, there has been some related work recently. Please see the patch from Roger Quadros posted at http://lkml.org/lkml/2014/1/8/142
I am not subscribed to ide list and I did not see that patch :(.
Will test our platform with above patch.
Regards
Pratyush
Quoted 4 lines
One of the two should be enough.
Arnd
PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver
In reply to Mohit KumarFrom: Pratyush Anand <[email protected]>
ahci driver needs some platform specific functions which are called at init, exit, suspend and resume conditions. Till now these functions were present in a platform driver with a fixme notes.
Similar functions modifying same set of registers will also be needed in case of PCIe phy init/exit.
So move all these SATA platform code to a proper phy driver.
Same phy driver will be used to add PCIe init/exit routine.
--- .../devicetree/bindings/phy/spear13xx-miphy.txt | 8 + arch/arm/boot/dts/spear1310-evb.dts | 4 + arch/arm/boot/dts/spear1310.dtsi | 36 +++- arch/arm/boot/dts/spear1340-evb.dts | 4 + arch/arm/boot/dts/spear1340.dtsi | 12 +- arch/arm/boot/dts/spear13xx.dtsi | 5 + arch/arm/mach-spear/Kconfig | 2 + arch/arm/mach-spear/spear1340.c | 127 +-------- drivers/phy/Kconfig | 6 + drivers/phy/Makefile | 1 + drivers/phy/phy-spear13xx-sata-pcie.c | 305 ++++++++++++++++++++ 11 files changed, 380 insertions(+), 130 deletions(-) create mode 100644 Documentation/devicetree/bindings/phy/spear13xx-miphy.txt create mode 100644 drivers/phy/phy-spear13xx-sata-pcie.c
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +8 -0
@@ -0,0 +1,8 @@ +Required properties: +- compatible : should be "st,spear1340-sata-pcie-phy". +- reg : offset and length of the PHY register set. +- misc: phandle for the syscon node to access misc registers +- #phy-cells : from the generic PHY bindings, must be 2. + - 1st arg: phandle to the phy node. + - 2nd arg: 0 if phy (in 1st arg) is to be used for sata else 1. + - 3rd arg: Instance id of the phy (in 1st arg).
arch/arm/boot/dts/spear1310-evb.dts +4 -0
@@ -106,6 +106,10 @@ status = "okay"; }; + miphy at eb800000 { + status = "okay"; + }; + cf at b2800000 { status = "okay"; };
arch/arm/boot/dts/spear1310.dtsi +33 -3
@@ -29,24 +29,54 @@ #gpio-cells = <2>; }; - ahci at b1000000 { + miphy0: miphy at eb800000 { + compatible = "st,spear1340-sata-pcie-phy"; + reg = <0xeb800000 0x4000>; + misc = <&misc>; + #phy-cells = <2>; + status = "disabled"; + }; + + miphy1: miphy at eb804000 { + compatible = "st,spear1340-sata-pcie-phy"; + reg = <0xeb804000 0x4000>; + misc = <&misc>; + #phy-cells = <2>; + status = "disabled"; + }; + + miphy2: miphy at eb808000 { + compatible = "st,spear1340-sata-pcie-phy"; + reg = <0xeb808000 0x4000>; + misc = <&misc>; + #phy-cells = <2>; + status = "disabled"; + }; + + ahci0: ahci at b1000000 { compatible = "snps,spear-ahci"; reg = <0xb1000000 0x10000>; interrupts = <0 68 0x4>; + phys = <&miphy0 0 0>; + phy-names = "ahci-phy"; status = "disabled"; }; - ahci at b1800000 { + ahci1: ahci at b1800000 { compatible = "snps,spear-ahci"; reg = <0xb1800000 0x10000>; interrupts = <0 69 0x4>; + phys = <&miphy1 0 1>; + phy-names = "ahci-phy"; status = "disabled"; }; - ahci at b4000000 { + ahci2: ahci at b4000000 { compatible = "snps,spear-ahci"; reg = <0xb4000000 0x10000>; interrupts = <0 70 0x4>; + phys = <&miphy2 0 2>; + phy-names = "ahci-phy"; status = "disabled"; };
arch/arm/boot/dts/spear1340-evb.dts +4 -0
@@ -122,6 +122,10 @@ status = "okay"; }; + miphy at eb800000 { + status = "okay"; + }; + dma at ea800000 { status = "okay"; };
arch/arm/boot/dts/spear1340.dtsi +11 -1
@@ -31,10 +31,20 @@ status = "disabled"; }; - ahci at b1000000 { + miphy0: miphy at eb800000 { + compatible = "st,spear1340-sata-pcie-phy"; + reg = <0xeb800000 0x4000>; + misc = <&misc>; + #phy-cells = <2>; + status = "disabled"; + }; + + ahci0: ahci at b1000000 { compatible = "snps,spear-ahci"; reg = <0xb1000000 0x10000>; interrupts = <0 72 0x4>; + phys = <&miphy0 0 0>; + phy-names = "ahci-phy"; status = "disabled"; };
arch/arm/boot/dts/spear13xx.dtsi +5 -0
@@ -220,6 +220,11 @@ 0xd8000000 0xd8000000 0x01000000 0xe0000000 0xe0000000 0x10000000>; + misc: syscon at e0700000 { + compatible = "st,spear1340-misc", "syscon"; + reg = <0xe0700000 0x1000>; + }; + gpio0: gpio at e0600000 { compatible = "arm,pl061", "arm,primecell"; reg = <0xe0600000 0x1000>;
arch/arm/mach-spear/Kconfig +2 -0
@@ -26,6 +26,8 @@ config ARCH_SPEAR13XX select MIGHT_HAVE_CACHE_L2X0 select PINCTRL select USE_OF + select MFD_SYSCON + select PHY_SPEAR13XX_SATA_PCIE help Supports for ARM's SPEAR13XX family
arch/arm/mach-spear/spear1340.c +1 -126
139 lines not on this page · raw message
drivers/phy/Kconfig +6 -0
@@ -51,4 +51,10 @@ config PHY_EXYNOS_DP_VIDEO help Support for Display Port PHY found on Samsung EXYNOS SoCs. +config PHY_SPEAR13XX_SATA_PCIE + tristate "SPEAr13xx SoC SATA PCIe PHY driver" + help + Support for SATA and PCIe PHY for SPEAr13xx SoC + select GENERIC_PHY + endmenu
drivers/phy/Makefile +1 -0
@@ -7,3 +7,4 @@ obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO) += phy-exynos-dp-video.o obj-$(CONFIG_PHY_EXYNOS_MIPI_VIDEO) += phy-exynos-mipi-video.o obj-$(CONFIG_OMAP_USB2) += phy-omap-usb2.o obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o +obj-$(CONFIG_PHY_SPEAR13XX_SATA_PCIE) += phy-spear13xx-sata-pcie.o
drivers/phy/phy-spear13xx-sata-pcie.c new file +305 -0
305 lines not on this page · raw message
Signature · 1 line
1.7.0.1
PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 2
Quoted 9 lines · Mohit Kumar
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +2
-0@@ -0,0 +1,8 @@ +Required properties: +- compatible : should be "st,spear1340-sata-pcie-phy".
Just for confirmation: This phy is by design only capable of driving sata or pcie, but nothing else if reused in a different SoC, right?
If the phy is actually more generic than that, I'd suggest changing the name, otherwise it's ok.
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 8
Quoted 6 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6
-0+- reg : offset and length of the PHY register set. +- misc: phandle for the syscon node to access misc registers +- #phy-cells : from the generic PHY bindings, must be 2. + - 1st arg: phandle to the phy node. + - 2nd arg: 0 if phy (in 1st arg) is to be used for sata else 1. + - 3rd arg: Instance id of the phy (in 1st arg).
I would count "arg" differently: There are three cells, and the first cell is the phandle, while the second and third cells contain the first and second argument.
The third cell seems redundant, more on that below.
Quoted 18 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6
-1+ ahci0: ahci at b1000000 { compatible = "snps,spear-ahci"; reg = <0xb1000000 0x10000>; interrupts = <0 68 0x4>; + phys = <&miphy0 0 0>; + phy-names = "ahci-phy"; status = "disabled"; }; - ahci at b1800000 { + ahci1: ahci at b1800000 { compatible = "snps,spear-ahci"; reg = <0xb1800000 0x10000>; interrupts = <0 69 0x4>; + phys = <&miphy1 0 1>; + phy-names = "ahci-phy"; status = "disabled"; };
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt
Quoted 10 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +3
-1- ahci at b4000000 { + ahci2: ahci at b4000000 { compatible = "snps,spear-ahci"; reg = <0xb4000000 0x10000>; interrupts = <0 70 0x4>; + phys = <&miphy2 0 2>; + phy-names = "ahci-phy"; status = "disabled"; };
In each case, the number of the phy 'miphyX' is identical to the third cell, and I suspect this is by design. In the driver, the 'id' field is set in the xlate function, but I could not find any place where it actually gets used, so unless you know that it's needed, I'd suggest simply removing it.
Even if you need it, it may be better to have the instance encoded in the phy node itself, since it's a property of the phy hardware (e.g. if you have to pass the number into a generic register that is global to all phys.
Alternatively, you could have a different representation, where you have a single DT device node representing all three PHYs, with "reg = <0xeb800000 0xc000>;" In that case, all sata devices would point to the same phy node and pass the instance id so the phy driver can operated the correct register set.
Quoted 9 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +9
-0+static int spear1340_sata_miphy_init(struct spear13xx_phy_priv *phypriv) +{ + regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_SATA_CFG, + SPEAR1340_PCIE_SATA_CFG_MASK, SPEAR1340_SATA_CFG_VAL); + regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_MIPHY_CFG, + SPEAR1340_PCIE_MIPHY_CFG_MASK, + SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK); + /* Switch on sata power domain */ + regmap_update_bits(phypriv->misc, SPEAR1340_PCM_CFG,
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt
Quoted 10 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +10
-0+ SPEAR1340_PCM_CFG_SATA_POWER_EN, + SPEAR1340_PCM_CFG_SATA_POWER_EN); + msleep(20); + /* Disable PCIE SATA Controller reset */ + regmap_update_bits(phypriv->misc, SPEAR1340_PERIP1_SW_RST, + SPEAR1340_PERIP1_SW_RST_SATA, 0); + msleep(20); + + return 0; +}
I guess some of the parts above can eventually get moved into other drivers (reset controller, power domains) that get called directly by the SATA driver (e.g. though reset_device()). Since that won't impact the PHY binding, it seems fine to leave it here for now.
Arnd
PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver
Quoted 14 lines · Arnd Bergmann
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 2
Quoted 9 lines · Mohit Kumar
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +2
-0@@ -0,0 +1,8 @@ +Required properties: +- compatible : should be "st,spear1340-sata-pcie-phy".Just for confirmation: This phy is by design only capable of driving sata or pcie, but nothing else if reused in a different SoC, right?
Quoted 2 lines
If the phy is actually more generic than that, I'd suggest changing the name, otherwise it's ok.
OK, we will give a generic name as it can be used for sata/pcie/usb3.0. Although, phy register definition may vary from version to version, but that can be managed,as and when support of new soc is added.
Quoted 11 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 8
Quoted 7 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6
-0+- reg : offset and length of the PHY register set. +- misc: phandle for the syscon node to access misc registers +- #phy-cells : from the generic PHY bindings, must be 2. + - 1st arg: phandle to the phy node. + - 2nd arg: 0 if phy (in 1st arg) is to be used for sata else 1. + - 3rd arg: Instance id of the phy (in 1st arg).I would count "arg" differently: There are three cells, and the first cell is the phandle, while the second and third cells contain the first and second argument.
Ok..will modify accordingly.
Quoted 22 lines
The third cell seems redundant, more on that below.
Quoted 19 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +6
-1+ ahci0: ahci at b1000000 { compatible = "snps,spear-ahci"; reg = <0xb1000000 0x10000>; interrupts = <0 68 0x4>; + phys = <&miphy0 0 0>; + phy-names = "ahci-phy"; status = "disabled"; }; - ahci at b1800000 { + ahci1: ahci at b1800000 { compatible = "snps,spear-ahci"; reg = <0xb1800000 0x10000>; interrupts = <0 69 0x4>; + phys = <&miphy1 0 1>; + phy-names = "ahci-phy"; status = "disabled"; };
Quoted 15 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt
Quoted 9 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +3
-1- ahci at b4000000 { + ahci2: ahci at b4000000 { compatible = "snps,spear-ahci"; reg = <0xb4000000 0x10000>; interrupts = <0 70 0x4>; + phys = <&miphy2 0 2>; + phy-names = "ahci-phy"; status = "disabled"; };In each case, the number of the phy 'miphyX' is identical to the third cell, and I suspect this is by design. In the driver, the 'id' field is set in the xlate function, but I could not find any place where it actually gets used, so unless you know that it's needed, I'd suggest simply removing it.
It has not been used in this patch, as SATA support is currently only for SPEAr1340, where we have only one instance.
Will be using it in PCIe for SPEAr1310 where 3 instances are present.
Quoted 5 lines
Even if you need it, it may be better to have the instance encoded in the phy node itself, since it's a property of the phy hardware (e.g. if you have to pass the number into a generic register that is global to all phys.
Ok..ll do that.
Quoted 6 lines
Alternatively, you could have a different representation, where you have a single DT device node representing all three PHYs, with "reg = <
0xeb8000000xc000>;" In that case, all sata devices would point to the same phy node and pass the instance id so the phy driver can operated the correct register set.
Instance ID is mainly needed to manipulate wrapper register present within SPEAr13xx misc space. We have a single register in misc space having bit fields controlling all 3 phys, and there we need this id.
Quoted 17 lines
Quoted 17 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +16
-0+static int spear1340_sata_miphy_init(struct spear13xx_phy_priv *phypriv) +{ + regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_SATA_CFG, + SPEAR1340_PCIE_SATA_CFG_MASK, SPEAR1340_SATA_CFG_VAL); + regmap_update_bits(phypriv->misc, SPEAR1340_PCIE_MIPHY_CFG, + SPEAR1340_PCIE_MIPHY_CFG_MASK, + SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK); + /* Switch on sata power domain */ + regmap_update_bits(phypriv->misc, SPEAR1340_PCM_CFG, + SPEAR1340_PCM_CFG_SATA_POWER_EN, + SPEAR1340_PCM_CFG_SATA_POWER_EN); + msleep(20); + /* Disable PCIE SATA Controller reset */ + regmap_update_bits(phypriv->misc, SPEAR1340_PERIP1_SW_RST, + SPEAR1340_PERIP1_SW_RST_SATA, 0); + msleep(20);
Quoted 8 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt
Quoted 3 lines
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +3
-0+ + return 0; +}I guess some of the parts above can eventually get moved into other drivers (reset controller, power domains) that get called directly by the SATA driver (e.g. though
reset_device()). Since that won't impact the PHY binding, it seems fine to leave it here for now.
thanks :)
Regards
Pratyush
Quoted 2 lines
Arnd
PATCH v3 6/8 SPEAr13xx: Fixup: Move SPEAr1340 SATA platform code to phy driver
Quoted 15 lines · Pratyush Anand
Quoted 14 lines · Arnd Bergmann
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt line 2
Quoted 9 lines · Mohit Kumar
Documentation/devicetree/bindings/phy/spear13xx-miphy.txt new file +2
-0@@ -0,0 +1,8 @@ +Required properties: +- compatible : should be "st,spear1340-sata-pcie-phy".Just for confirmation: This phy is by design only capable of driving sata or pcie, but nothing else if reused in a different SoC, right?
Quoted 6 lines
Quoted 2 lines
If the phy is actually more generic than that, I'd suggest changing the name, otherwise it's ok.
OK, we will give a generic name as it can be used for sata/pcie/usb3.0. Although, phy register definition may vary from version to version, but that can be managed,as and when support of new soc is added.
It probably doesn't hurt to already define a list of possible modes in the binding that you already know about. That way, you don't have to update the binding in sync with the driver if you add another mode, such as USB.
Arnd
PATCH v3 7/8 pcie: SPEAr13xx: Add designware pcie support
In reply to Mohit KumarFrom: Pratyush Anand <[email protected]>
SPEAr1310 and SPEAr1340 SOC uses designware PCIe controller. Add SPEAr13xx PCIe driver based on designware controller driver.
SPEAr1310 has 3 PCIe ports and SPEAr1340 has 1, which are multiplexed with ahci/sata pins. By default evaluation board of both controller works for ahci mode.
To use these patches on SPEAr1340/1310 evaluation board, do the necessary modifications on board and enable (okay) pcie and miphy from respective evb dtsi file.
--- .../devicetree/bindings/pci/spear13xx-pcie.txt | 7 + arch/arm/boot/dts/spear1310.dtsi | 51 +++ arch/arm/boot/dts/spear1340.dtsi | 17 + arch/arm/boot/dts/spear13xx.dtsi | 5 +- arch/arm/configs/spear13xx_defconfig | 2 + arch/arm/mach-spear/Kconfig | 1 + drivers/pci/host/Kconfig | 5 + drivers/pci/host/Makefile | 1 + drivers/pci/host/pcie-spear13xx.c | 407 ++++++++++++++++++++ drivers/phy/phy-spear13xx-sata-pcie.c | 176 +++++++++ 10 files changed, 670 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/spear13xx-pcie.txt create mode 100644 drivers/pci/host/pcie-spear13xx.c
Documentation/devicetree/bindings/pci/spear13xx-pcie.txt new file +7 -0
@@ -0,0 +1,7 @@ +Required properties: +- compatible : should be "st,spear1340-pcie", "snps,dw-pcie". +- pcie_is_gen1: pass <1> if forced gen1 initialization is needed to work with + some buggy cards else pass <0>. +- phys : phandle to phy node associated with pcie controller +- phy-names : must be "pcie-phy" +- All other definitions as per generic PCI bindings
arch/arm/boot/dts/spear1310.dtsi +51 -0
57 lines not on this page · raw message
arch/arm/boot/dts/spear1340.dtsi +17 -0
@@ -48,6 +48,23 @@ status = "disabled"; }; + pcie0: pcie@b1000000 { + compatible = "st,spear1340-pcie", "snps,dw-pcie"; + reg = <0xb1000000 0x4000>; + interrupts = <0 68 0x4>; + pcie_is_gen1 = <0>; + num-lanes = <1>; + phys = <&miphy0 1 0>; + phy-names = "pcie-phy"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000 /* configuration space */ + 0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */ + 0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */ + status = "disabled"; + }; + i2s-play@b2400000 { compatible = "snps,designware-i2s"; reg = <0xb2400000 0x10000>;
arch/arm/boot/dts/spear13xx.dtsi +3 -2
@@ -83,8 +83,8 @@ #size-cells = <1>; compatible = "simple-bus"; ranges = <0x50000000 0x50000000 0x10000000 - 0xb0000000 0xb0000000 0x10000000 - 0xd0000000 0xd0000000 0x02000000 + 0x80000000 0x80000000 0x20000000 + 0xb0000000 0xb0000000 0x22000000 0xd8000000 0xd8000000 0x01000000 0xe0000000 0xe0000000 0x10000000>;
@@ -338,6 +338,7 @@ reg = <0xe07008c4 0x4>; thermal_flags = <0x7000>; }; + }; }; };
arch/arm/configs/spear13xx_defconfig +2 -0
@@ -11,6 +11,8 @@ CONFIG_ARCH_SPEAR13XX=y CONFIG_MACH_SPEAR1310=y CONFIG_MACH_SPEAR1340=y # CONFIG_SWP_EMULATE is not set +CONFIG_PCI_MSI=y +CONFIG_PCIE_SPEAR13XX=y CONFIG_SMP=y # CONFIG_SMP_ON_UP is not set # CONFIG_ARM_CPU_TOPOLOGY is not set
arch/arm/mach-spear/Kconfig +1 -0
@@ -28,6 +28,7 @@ config ARCH_SPEAR13XX select USE_OF select MFD_SYSCON select PHY_SPEAR13XX_SATA_PCIE + select PCI help Supports for ARM's SPEAR13XX family
drivers/pci/host/Kconfig +5 -0
@@ -33,4 +33,9 @@ config PCI_RCAR_GEN2 There are 3 internal PCI controllers available with a single built-in EHCI/OHCI host controller present on each one. +config PCIE_SPEAR13XX + bool "STMicroelectronics SPEAr PCIe controller" + depends on ARCH_SPEAR13XX + select PCIEPORTBUS + select PCIE_DW endmenu
drivers/pci/host/Makefile +1 -0
@@ -4,3 +4,4 @@ obj-$(CONFIG_PCI_IMX6) += pci-imx6.o obj-$(CONFIG_PCI_MVEBU) += pci-mvebu.o obj-$(CONFIG_PCI_TEGRA) += pci-tegra.o obj-$(CONFIG_PCI_RCAR_GEN2) += pci-rcar-gen2.o +obj-$(CONFIG_PCIE_SPEAR13XX) += pcie-spear13xx.o
drivers/pci/host/pcie-spear13xx.c new file +407 -0
407 lines not on this page · raw message
drivers/phy/phy-spear13xx-sata-pcie.c +176 -0
200 lines not on this page · raw message
Signature · 1 line
1.7.0.1
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 10 lines · Mohit Kumar
arch/arm/boot/dts/spear1310.dtsi +6
-0@@ -80,6 +80,57 @@ status = "disabled"; }; + pcie0: pcie@b1000000 { + compatible = "st,spear1340-pcie", "snps,dw-pcie"; + reg = <0xb1000000 0x4000>; + interrupts = <0 68 0x4>; + pcie_is_gen1 = <0>; + num-lanes = <1>;
arch/arm/boot/dts/spear1310.dtsi line 98
Quoted 10 lines
arch/arm/boot/dts/spear1310.dtsi +10
-0+ phys = <&miphy0 1 0>; + phy-names = "pcie-phy"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000 /* configuration space */ + 0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */ + 0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */ + status = "disabled"; + };
Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.
drivers/pci/host/pcie-spear13xx.c line 326
Quoted 5 lines
drivers/pci/host/pcie-spear13xx.c new file +5
-0+ spear13xx_pcie->phy =devm_phy_get (dev,"pcie-phy" ); +if (IS_ERR (spear13xx_pcie->phy)) { +dev_err (dev,"Could not get PHY\n" ); +return -EPROBE_DEFER ; + }
I think you should only return -EPROBE_DEFER if you got that error from the PHY layer. If there is some other problem with getting the PHY, you want that returned as a fatal error here and not retry the PCIe probe function.
drivers/phy/phy-spear13xx-sata-pcie.c line 73
Quoted 8 lines
drivers/phy/phy-spear13xx-sata-pcie.c +0
-0@@ -71,6 +71,80 @@#define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \ (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \ SPEAR1340_MIPHY_PLL_RATIO_TOP(25))
Please split this out into a separate patch.
Quoted 11 lines
drivers/phy/phy-spear13xx-sata-pcie.c +11
-0+static int spear1310_pcie_miphy_init (struct spear13xx_phy_priv *phypriv) +{ +u32 mask, val; + +regmap_update_bits (phypriv->misc,SPEAR1310_PCIE_MIPHY_CFG_1 , +SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK , +SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE ); + +switch (phypriv->id) { +case 0 : + mask =SPEAR1310_PCIE_CFG_MASK (0 );
drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 272
Quoted 10 lines
drivers/phy/phy-spear13xx-sata-pcie.c +10
-0+ val =SPEAR1310_PCIE_CFG_VAL (0 ); +break ; +case 1 : + mask =SPEAR1310_PCIE_CFG_MASK (1 ); + val =SPEAR1310_PCIE_CFG_VAL (1 ); +break ; +case 2 : + mask =SPEAR1310_PCIE_CFG_MASK (2 ); + val =SPEAR1310_PCIE_CFG_VAL (2 ); +break ;
Ah, so this is what the ID gets used for. I would indeed encode this in the phy node, unlike the configuration of whether it's used for PCIe or SATA.
drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 317
Quoted 9 lines
drivers/phy/phy-spear13xx-sata-pcie.c +9
-0+static int pcie_miphy_init (struct spear13xx_phy_priv *phypriv) +{ +if (of_machine_is_compatible ("st,spear1340" )) +return spear1340_pcie_miphy_init (phypriv); +else if (of_machine_is_compatible ("st,spear1310" )) +return spear1310_pcie_miphy_init (phypriv); +else +return -EINVAL ; +}
You should never check global properties such as the machine compatible value to make local decisions. You have two options here: Either use two different compatible strings for the phy node, or encode the difference in another property. If the only difference between spear1310 and spear1340 is the location of the register within the "misc" syscon space, a good represenation would be to put the register offset next to the syscon phandle in the same property. That way it could transparently work for future SoCs.
Arnd
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 17 lines · Arnd Bergmann
Quoted 6 lines
arch/arm/boot/dts/spear1310.dtsi +6
-0+ pcie0: pcie@b1000000 { + compatible = "st,spear1340-pcie", "snps,dw-pcie"; + reg = <0xb1000000 0x4000>; + interrupts = <0 68 0x4>; + pcie_is_gen1 = <0>; + num-lanes = <1>;arch/arm/boot/dts/spear1310.dtsi line 98
Quoted 10 lines
arch/arm/boot/dts/spear1310.dtsi +10
-0+ phys = <&miphy0 1 0>; + phy-names = "pcie-phy"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000 /* configuration space */ + 0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */ + 0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */ + status = "disabled"; + };
Quoted 3 lines
Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.
Sorry, my mistake: I was thinking of the interrupt map for legacy IRQs. The interrupt here is used only for the integrated MSI controller, right? That seems fine from the DT bindings perspective but raises two other questions:
1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?
2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68 0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?
Arnd
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 18 lines · Arnd Bergmann
Quoted 17 lines · Arnd Bergmann
Quoted 16 lines
arch/arm/boot/dts/spear1310.dtsi +16
-0+ pcie0: pcie@b1000000 { + compatible = "st,spear1340-pcie", "snps,dw-pcie"; + reg = <0xb1000000 0x4000>; + interrupts = <0 68 0x4>; + pcie_is_gen1 = <0>; + num-lanes = <1>; + phys = <&miphy0 1 0>; + phy-names = "pcie-phy"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000 /* configuration space */ + 0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */ + 0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */ + status = "disabled"; + };
Quoted 6 lines
Quoted 3 lines
Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.
Sorry, my mistake: I was thinking of the interrupt map for legacy IRQs. The interrupt here is used only for the integrated MSI controller, right?
yes.
Quoted 5 lines
That seems fine from the DT bindings perspective but raises two other questions:
1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?
As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.
Quoted 6 lines
2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68
0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?
If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.
We have never seen any erroneous behaviour with MSI interrupt.
Regards
Pratyush
Quoted 2 lines
Arnd
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 8 lines · Pratyush Anand
Quoted 5 lines
That seems fine from the DT bindings perspective but raises two other questions:
1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?
As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.
Hmm, that sounds hard to believe. Doesn't that exclude 90% of the add-on cards? I noticed that imx also doesn't have it, but exynos does.
Can you check the data sheet again? Maybe the IntA IRQs are not mapped to host (GIC) IRQs but instead get handled internally in the MSI controller? IIRC, PCIe INTa IRQs are implemented as MSI on the bus, but normally get turned into physical IRQ lines by the root complex. If the RC contains the MSI controller itself, that may have a special register for the LSI.
Quoted 14 lines
Quoted 5 lines
2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68
0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.
Quoted 1 line
We have never seen any erroneous behaviour with MSI interrupt.
There should not be a separate interrupt for DMA, the typical behavior of a PCIe adapter (SCSI, ethernet, ...) is that it sends an MSI after data has arrived from an external interface and gets submitted as a bus-master DMA into main memory. The actual data transfer may have the 'relaxed ordering' bit set on the PCIe transaction, but the MSI message (which is essentially a 4-byte DMA) will not, which means that all buses are required to only forward the MSI after the DMA is completed. If the PCIe host is located on a bus that is not directly connected to the memory controller, the RC may have seen the DMA complete and signalled the IRC to the CPU while the data transfer is still in progress on its way to the actual memory.
That kind of problem is extremely hard to debug and will only occur in rare cases of bus congestion.
Arnd
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 7 lines · Arnd Bergmann
Quoted 6 lines · Pratyush Anand
Quoted 5 lines
That seems fine from the DT bindings perspective but raises two other questions:
1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?
Quoted 7 lines
Quoted 2 lines
As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.
Hmm, that sounds hard to believe. Doesn't that exclude 90% of the add-on cards? I noticed that imx also doesn't have it, but exynos does.
Can you check the data sheet again? Maybe the IntA IRQs are not mapped to
I did not say that designware controller does not supoort it. It does support. But pcie-designware driver is not supporting it as of now. I think, a common irq_chip for intx handling need to be created in designware driver.
I am not sure even if exynos does define dt bindings for irq, are they able to use it?
Jingoo can comment.
Quoted 5 lines
host (GIC) IRQs but instead get handled internally in the MSI controller? IIRC, PCIe INTa IRQs are implemented as MSI on the bus, but normally get turned into physical IRQ lines by the root complex. If the RC contains the MSI controller itself, that may have a special register for the LSI.
I agree that in PCIe Intx is also handled as message only. As far as designware controller is concerned, it has different intx and msi controller. Now, a SoC can have two different irq line or can have a single irq line at gic for MSI and INTx. In SPEAr13xx we have a single IRQ line for both MSI and INTx.
Once this patch set gets into mainline, may be someone of us will work to add irq chip for INTx in common designware driver, and also its wrapper in SPEAr13xx pcie driver. At that time we will add interrupt-map property to enable legacy IntA.
Quoted 29 lines
Quoted 15 lines
Quoted 6 lines
2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68
0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.Quoted 1 line
We have never seen any erroneous behaviour with MSI interrupt.
There should not be a separate interrupt for DMA, the typical behavior of a PCIe adapter (SCSI, ethernet, ...) is that it sends an MSI after data has arrived from an external interface and gets submitted as a bus-master DMA into main memory. The actual data transfer may have the 'relaxed ordering' bit set on the PCIe transaction, but the MSI message (which is essentially a 4-byte DMA) will not, which means that all buses are required to only forward the MSI after the DMA is completed. If the PCIe host is located on a bus that is not directly connected to the memory controller, the RC may have seen the DMA complete and signalled the IRC to the CPU while the data transfer is still in progress on its way to the actual memory.
Quoted 2 lines
That kind of problem is extremely hard to debug and will only occur in rare cases of bus congestion.
Agreed, But there is anything special for software to do here?
Thanks a lot for your review.
Regards
Pratyush
Quoted 7 lines
Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 16 lines · Pratyush Anand
Quoted 7 lines · Arnd Bergmann
Quoted 6 lines · Pratyush Anand
Quoted 5 lines
That seems fine from the DT bindings perspective but raises two other questions:
1. Are you not lacking an interrupt-map property to enable legacy IntA IRQs?
Quoted 7 lines
Quoted 2 lines
As current pcie-designeware driver is not supporting legacy IntA IRQs, so we left it.
Hmm, that sounds hard to believe. Doesn't that exclude 90% of the add-on cards? I noticed that imx also doesn't have it, but exynos does.
Can you check the data sheet again? Maybe the IntA IRQs are not mapped to
Quoted 8 lines
I did not say that designware controller does not supoort it. It does support. But pcie-designware driver is not supporting it as of now. I think, a common
irq_chipfor intx handling need to be created in designware driver.I am not sure even if exynos does define dt bindings for irq, are they able to use it?
Jingoo can comment.
In the case of Exynos, there are three interrupts for PCIe; it has different INTx line and MSI line for interrupts.
./arch/arm/boot/dts/exynos5440.dtsi
interrupts = <0 20 0>, <0 21 0>, <0 22 0>;
<0 20 0>: PCIe RC0 pulse interrupt,
INTA, INTB, INTC and INTD, etc
<0 21 0>: PCIe RC0 level interrupt,
MSI, etc
<0 22 0>: PCIe RC0 special interrupt,
PHY Link related interrupts, etc
Of course, legacy INTx is handled as message only.
Best regards,
Jingoo Han
Quoted 59 lines
Quoted 6 lines
host (GIC) IRQs but instead get handled internally in the MSI controller? IIRC, PCIe INTa IRQs are implemented as MSI on the bus, but normally get turned into physical IRQ lines by the root complex. If the RC contains the MSI controller itself, that may have a special register for the LSI.
I agree that in PCIe Intx is also handled as message only. As far as designware controller is concerned, it has different intx and msi controller. Now, a SoC can have two different irq line or can have a single irq line at gic for MSI and INTx. In SPEAr13xx we have a single IRQ line for both MSI and INTx.
Once this patch set gets into mainline, may be someone of us will work to add irq chip for INTx in common designware driver, and also its wrapper in SPEAr13xx pcie driver. At that time we will add interrupt-map property to enable legacy IntA.
Quoted 29 lines
Quoted 15 lines
Quoted 6 lines
2. If the MSI controller is integrated in the pcie host controller, does that maintain the PCIe ordering guarantees between inbound DMA and MSI, or is it possible that the <0 68
0x4> IRQ gets raised at the CPU before the the DMA transfer becomes visible to the CPU in main memory?If the system does not guarantee it, then won't be it a bug in the hardware?
In our case, there is no separate interrupt for DMA completion. (I do not know if other system does have DMA interrupt). We have only one interrupt and when it is received SW will look into main memory (MSI address) for MSI data. If DMA transfer is yet not complete, then SW ll read junk data and which will be a bug.Quoted 1 line
We have never seen any erroneous behaviour with MSI interrupt.
There should not be a separate interrupt for DMA, the typical behavior of a PCIe adapter (SCSI, ethernet, ...) is that it sends an MSI after data has arrived from an external interface and gets submitted as a bus-master DMA into main memory. The actual data transfer may have the 'relaxed ordering' bit set on the PCIe transaction, but the MSI message (which is essentially a 4-byte DMA) will not, which means that all buses are required to only forward the MSI after the DMA is completed. If the PCIe host is located on a bus that is not directly connected to the memory controller, the RC may have seen the DMA complete and signalled the IRC to the CPU while the data transfer is still in progress on its way to the actual memory.
Quoted 2 lines
That kind of problem is extremely hard to debug and will only occur in rare cases of bus congestion.
Agreed, But there is anything special for software to do here?
Thanks a lot for your review.
Regards
PratyushQuoted 3 lines
Arnd
--
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
In reply to Arnd BergmannQuoted 27 lines · Arnd Bergmann
Quoted 10 lines · Mohit Kumar
arch/arm/boot/dts/spear1310.dtsi +6
-0@@ -80,6 +80,57 @@ status = "disabled"; }; + pcie0: pcie@b1000000 { + compatible = "st,spear1340-pcie", "snps,dw-pcie"; + reg = <0xb1000000 0x4000>; + interrupts = <0 68 0x4>; + pcie_is_gen1 = <0>; + num-lanes = <1>;arch/arm/boot/dts/spear1310.dtsi line 98
Quoted 10 lines
arch/arm/boot/dts/spear1310.dtsi +10
-0+ phys = <&miphy0 1 0>; + phy-names = "pcie-phy"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000 /* configuration space */ + 0x81000000 0 0 0x80020000 0 0x00010000 /* downstream I/O */ + 0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */ + status = "disabled"; + };Shouldn't there be more than one interrupt? Normally each root port has four legacy IRQs, in order to support bridge devices.
Quoted 10 lines
drivers/pci/host/pcie-spear13xx.c line 326
Quoted 5 lines
drivers/pci/host/pcie-spear13xx.c new file +5
-0+ spear13xx_pcie->phy =devm_phy_get (dev,"pcie-phy" ); +if (IS_ERR (spear13xx_pcie->phy)) { +dev_err (dev,"Could not get PHY\n" ); +return -EPROBE_DEFER ; + }I think you should only return -EPROBE_DEFER if you got that error from the PHY layer. If there is some other problem with getting the PHY, you want that returned as a fatal error here and not retry the PCIe probe function.
OK.
Quoted 11 lines
drivers/phy/phy-spear13xx-sata-pcie.c line 73
Quoted 9 lines
drivers/phy/phy-spear13xx-sata-pcie.c +0
-0@@ -71,6 +71,80 @@#define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \ (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \ SPEAR1340_MIPHY_PLL_RATIO_TOP(25))Please split this out into a separate patch.
ok.
Quoted 17 lines
Quoted 17 lines
drivers/phy/phy-spear13xx-sata-pcie.c +16
-0+static int spear1310_pcie_miphy_init (struct spear13xx_phy_priv *phypriv) +{ +u32 mask, val; + +regmap_update_bits (phypriv->misc,SPEAR1310_PCIE_MIPHY_CFG_1 , +SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK , +SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE ); + +switch (phypriv->id) { +case 0 : + mask =SPEAR1310_PCIE_CFG_MASK (0 ); + val =SPEAR1310_PCIE_CFG_VAL (0 ); +break ; +case 1 : + mask =SPEAR1310_PCIE_CFG_MASK (1 ); + val =SPEAR1310_PCIE_CFG_VAL (1 );
Quoted 8 lines
drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 272
Quoted 5 lines
drivers/phy/phy-spear13xx-sata-pcie.c +5
-0+break ; +case 2 : + mask =SPEAR1310_PCIE_CFG_MASK (2 ); + val =SPEAR1310_PCIE_CFG_VAL (2 ); +break ;Ah, so this is what the ID gets used for. I would indeed encode this in the phy node, unlike the configuration of whether it's used for PCIe or SATA.
ok.. ll use "phy_id = <n>;" in phy node.
Quoted 11 lines
drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 317
Quoted 10 lines
drivers/phy/phy-spear13xx-sata-pcie.c +9
-0+static int pcie_miphy_init (struct spear13xx_phy_priv *phypriv) +{ +if (of_machine_is_compatible ("st,spear1340" )) +return spear1340_pcie_miphy_init (phypriv); +else if (of_machine_is_compatible ("st,spear1310" )) +return spear1310_pcie_miphy_init (phypriv); +else +return -EINVAL ; +}
Quoted 8 lines
You should never check global properties such as the machine compatible value to make local decisions. You have two options here: Either use two different compatible strings for the phy node, or encode the difference in another property. If the only difference between spear1310 and spear1340 is the location of the register within the "misc" syscon space, a good represenation would be to put the register offset next to the syscon phandle in the same property. That way it could transparently work for future SoCs.
Currently, there is only difference in misc syscon space. But, as I said few phy register definition might also change in different soc.
Ok.. I ll go with first option, ie different compatible string for different socs. It seems most logical also.
Regards
Pratyush
Quoted 2 lines
Arnd
Re: [PATCH V3 7/8] pcie: SPEAr13xx: Add designware pcie support
Quoted 7 lines · Pratyush Anand
Quoted 4 lines · Arnd Bergmann
On Thursday 30 January 2014, Mohit Kumar wrote:
Ah, so this is what the ID gets used for. I would indeed encode this in the phy node, unlike the configuration of whether it's used for PCIe or SATA.
ok.. ll use "
phy_id= <n>;" in phy node.
Ok. Minor comment: the preferred style would be 'phy-id' rather than 'phy_id' in DT,
Quoted 19 lines
Quoted 10 lines
drivers/phy/phy-spear13xx-sata-pcie.c static int sata_miphy_resume(struct spear13xx_phy_priv *phypriv) · line 317
Quoted 9 lines
drivers/phy/phy-spear13xx-sata-pcie.c +9
-0+static int pcie_miphy_init (struct spear13xx_phy_priv *phypriv) +{ +if (of_machine_is_compatible ("st,spear1340" )) +return spear1340_pcie_miphy_init (phypriv); +else if (of_machine_is_compatible ("st,spear1310" )) +return spear1310_pcie_miphy_init (phypriv); +else +return -EINVAL ; +}Quoted 8 lines
You should never check global properties such as the machine compatible value to make local decisions. You have two options here: Either use two different compatible strings for the phy node, or encode the difference in another property. If the only difference between spear1310 and spear1340 is the location of the register within the "misc" syscon space, a good represenation would be to put the register offset next to the syscon phandle in the same property. That way it could transparently work for future SoCs.
Quoted 5 lines
Currently, there is only difference in misc syscon space. But, as I said few phy register definition might also change in different soc.
Ok.. I ll go with first option, ie different compatible string for different socs. It seems most logical also.
Ok.
Arnd
PATCH v3 8/8 MAINTAINERS: Add ST SPEAr13xx PCIe driver maintainer
In reply to Mohit KumarAdd Mohit Kumar as maintainer for ST SPEAr13xx PCIe driver.
--- MAINTAINERS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
MAINTAINERS +6 -0
@@ -6462,6 +6462,12 @@ L: [email protected] S: Maintained F: drivers/pci/host/pci-exynos.c +PCIE DRIVER FOR ST SPEAR13XX +M: Mohit Kumar <[email protected]> +L: [email protected] +S: Maintained +F: drivers/pci/host/pcie-spear13xx.c + PCMCIA SUBSYSTEM P: Linux PCMCIA Team L: [email protected]
Signature · 1 line
1.7.0.1
Re: [PATCH V3 8/8] MAINTAINERS: Add ST SPEAr13xx PCIe driver maintainer
Quoted 6 lines · Mohit Kumar
Add Mohit Kumar as maintainer for ST SPEAr13xx PCIe driver.
Signed-off-by Mohit Kumar <[email protected]>Signed-off-by Pratyush Anand <[email protected]>Cc Jingoo Han <[email protected]>
Best regards,
Jingoo Han
Quoted 24 lines
--- MAINTAINERS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)MAINTAINERS +6
-1@@ -6462,6 +6462,12 @@ L: [email protected] S: Maintained F: drivers/pci/host/pci-exynos.c +PCIE DRIVER FOR ST SPEAR13XX +M: Mohit Kumar <[email protected]> +L: [email protected] +S: Maintained +F: drivers/pci/host/pcie-spear13xx.c + PCMCIA SUBSYSTEM P: Linux PCMCIA Team L: [email protected] --1.7.0.1