--- a/arch/arm/boot/dts/imx6q.dtsi +++ b/arch/arm/boot/dts/imx6q.dtsi @@ -391,6 +391,15 @@ status = "disabled"; }; + pcie: pcie@01ffc000 { + #crtc-cells = <1>; + compatible = "fsl,imx6q-pcie", "fsl,pcie"; + reg = <0x01ffc000 0x4000>; + clocks = <&clks 144>, <&clks 189>; + clock-names = "pcie_axi", "pcie_ref_125m"; + status = "disabled"; + }; + ipu2: ipu@02800000 { #crtc-cells = <1>; compatible = "fsl,imx6q-ipu"; --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -790,6 +790,8 @@ config SOC_IMX6Q bool "i.MX6 Quad/DualLite support" select ARCH_HAS_CPUFREQ select ARCH_HAS_OPP + select ARCH_HAS_IMX_PCIE + select ARCH_SUPPORTS_MSI select ARM_CPU_SUSPEND if PM select ARM_ERRATA_754322 select ARM_ERRATA_764369 if SMP @@ -816,6 +818,10 @@ config SOC_IMX6Q help This enables support for Freescale i.MX6 Quad processor. +config IMX_PCIE + bool "PCI Express support" + select PCI + endif source "arch/arm/mach-imx/devices/Kconfig" --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -98,6 +98,8 @@ AFLAGS_headsmp.o :=-Wa,-march=armv7-a obj-$(CONFIG_SMP) += headsmp.o platsmp.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o +obj-$(CONFIG_IMX_PCIE) += pcie.o +obj-$(CONFIG_PCI_MSI) += msi.o ifeq ($(CONFIG_PM),y) obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -547,6 +547,12 @@ int __init mx6q_clocks_init(void) clk_register_clkdev(clk[ahb], "ahb", NULL); clk_register_clkdev(clk[cko1], "cko1", NULL); clk_register_clkdev(clk[arm], NULL, "cpu0"); + clk_register_clkdev(clk[pcie_axi_sel], "pcie_axi_sel", NULL); + clk_register_clkdev(clk[axi], "axi", NULL); + clk_register_clkdev(clk[pll6_enet], "pll6_enet", NULL); + clk_register_clkdev(clk[pcie_ref], "pcie_ref", NULL); + clk_register_clkdev(clk[pcie_ref_125m], "pcie_ref_125m", NULL); + clk_register_clkdev(clk[pcie_axi], "pcie_axi", NULL); if (imx6q_revision() != IMX_CHIP_REVISION_1_0) { clk_set_parent(clk[ldb_di0_sel], clk[pll5_video_div]); --- a/arch/arm/mach-imx/mxc.h +++ b/arch/arm/mach-imx/mxc.h @@ -151,6 +151,10 @@ extern unsigned int __mxc_cpu_type; # define cpu_is_mx53() (0) #endif +#ifdef CONFIG_SOC_IMX6Q +# define mxc_cpu_type __mxc_cpu_type +#endif + #ifndef __ASSEMBLY__ static inline bool cpu_is_imx6dl(void) { --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -178,6 +178,9 @@ extern int pci_ioremap_io(unsigned int o */ #ifdef CONFIG_NEED_MACH_IO_H #include +#elif defined(CONFIG_SOC_IMX6Q) && defined(CONFIG_IMX_PCIE) +#define IO_SPACE_LIMIT ((resource_size_t)0xffffffff) +#define __io(a) __typesafe_io((a) & IO_SPACE_LIMIT) #elif defined(CONFIG_PCI) #define IO_SPACE_LIMIT ((resource_size_t)0xfffff) #define __io(a) __typesafe_io(PCI_IO_VIRT_BASE + ((a) & IO_SPACE_LIMIT))